有没有办法使用 SendKeys VB 函数或 keybd_event User32 库函数自行发送单个 Shift 击键?

Is there a way to use the SendKeys VB function or keybd_event User32 library function to send a single Shift keystroke by itself?

我正在使用 Dragon NaturallySpeaking 的语音识别插件来使用我的声音创建击键自动化。该插件公开了 VB 函数 SendKeys。我知道 shift 键修饰符 (+) 可以与几乎任何其他字符组合,但我并没有尝试将 shift 键与任何东西组合;我只想发送一个 shift 按键而不发送任何其他内容。这可能吗?

我尝试过的一些事情:

SendKeys "+"

SendKeys "{Shift}"

有什么想法吗?

更新:

基于article posted by user14797724, it's use of the keybd_event User32 library function, and the documentation for the System.Windows.Forms.Keys enumeration,我修改了代码以使用左移。这是代码:

Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Public Module SendWinKey
    Const KEYEVENTF_KEYDOWN As Integer = &H0
    Const KEYEVENTF_KEYUP As Integer = &H2

    Declare Sub keybd_event Lib "User32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As UInteger, ByVal dwExtraInfo As UInteger)

Public Sub Main()    
        keybd_event(CByte(Keys.LShiftKey), 0, KEYEVENTF_KEYDOWN, 0) 'press the left shift key down
        keybd_event(CByte(Keys.LShiftKey), 0, KEYEVENTF_KEYUP, 0) 'release the left shift key
End Sub

End Module

我希望这对我有用,但我使用的脚本环境似乎不支持 Imports 关键字并且需要 CLS-Compliant variables for an external call. I might be able to get around the Imports keyword problem by prefixing the appropriate types with their full namespace but does anybody have an alternative external call I might make that is CLS-Compliant? The UInteger 类型似乎是它不喜欢的类型。

更新 2:

当我把 VBScript 作为我的标签之一时,我不知道自己在想什么。我标记了 VBA 但有人将其编辑掉了。据我所知,我使用的“语言”是 Visual Basic 的一个子集。这是编辑器的屏幕截图。

原来我可以用 Integer 类型替换 UInteger 类型。然后我不得不弄清楚如何消除 CByte 调用和 System.Windows.Forms.Keys 枚举。最后,我只是删除了不必要的 Module 声明,现在一切似乎都运行良好。是的,我确实重复了按键向上和向下按键事件,因为我实际上想按两次 shift 键。感谢所有试图提供帮助的人。

'Press and release the left shift key twice

Const LSHIFT As Byte = 160 'Defined here https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.keys?view=net-5.0
Const KEYEVENTF_KEYDOWN As Integer = &H0
Const KEYEVENTF_KEYUP As Integer = &H2

Declare Sub keybd_event Lib "User32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)

Sub Main()    
  keybd_event(LSHIFT, 0, KEYEVENTF_KEYDOWN, 0) 'press the left shift key down
  keybd_event(LSHIFT, 0, KEYEVENTF_KEYUP, 0) 'release the left shift key
  keybd_event(LSHIFT, 0, KEYEVENTF_KEYDOWN, 0) 'press the left shift key down
  keybd_event(LSHIFT, 0, KEYEVENTF_KEYUP, 0) 'release the left shift key
End Sub

是啊,他说的。我可以看到你在哪里对你的答案进行了一些思考。我建议你在 160 旁边添加注释以解释它的来源。