首先,我不是一个真正的编码员,但我对迄今所做的事情感到满意。
我在下面写了这个与机器人有关的代码。下面的代码允许我在单击表单时使用键盘快捷键。但是,无论应用程序是否处于焦点或甚至最小化,我都需要使用热键。
我已经在网上看了但是不太清楚。
Public Class MainForm
Private Sub MainForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Control Then
DF1Com1.Write("O:1/0", "1") ' (O:9/0) (R)
End If
'If e.KeyCode = Keys.R Then
'DF1Com1.Write("O:1/0", "1") ' (O:9/0) (R)
'End If
End Sub
Private Sub MainForm_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Control Then
DF1Com1.Write("O:1/0", "0") ' (O:9/0) (R)
End If
'If e.KeyCode = Keys.R Then
'DF1Com1.Write("O:1/0", "0") ' (O:9/0) (R)
'End If
End Sub
Public Class MainForm
Private Sub MainForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Control Then
DF1Com1.Write("O:1/0", "1") ' (O:9/0) (R)
End If
'If e.KeyCode = Keys.R Then
'DF1Com1.Write("O:1/0", "1") ' (O:9/0) (R)
'End If
End Sub
Private Sub MainForm_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Control Then
DF1Com1.Write("O:1/0", "0") ' (O:9/0) (R)
End If
'If e.KeyCode = Keys.R Then
'DF1Com1.Write("O:1/0", "0") ' (O:9/0) (R)
'End If
End Sub
End Class
更新:
右。我现在添加了一个允许GlobalKey注册的类。
在我的主要表格中,我现在有了这个键:
Public Class MainForm
Dim hkr As New HotKeyRegistryClass(Me.Handle)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
hkr.Register(HotKeyRegistryClass.Modifiers.MOD_CTRL, Keys.A).ToString()
hkr.Register(HotKeyRegistryClass.Modifiers.MOD_CTRL, Keys.S).ToString()
hkr.Register(HotKeyRegistryClass.Modifiers.MOD_CTRL, Keys.D).ToString()
hkr.Register(HotKeyRegistryClass.Modifiers.MOD_CTRL, Keys.F).ToString()
hkr.Register(HotKeyRegistryClass.Modifiers.MOD_CTRL, Keys.G).ToString()
hkr.Register(HotKeyRegistryClass.Modifiers.MOD_SHIFT Or HotKeyRegistryClass.Modifiers.MOD_CTRL, Keys.H).ToString()
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = HotKeyRegistryClass.Messages.WM_HOTKEY Then 'NOT THE ACTUAL WINDOWS NAMESPACE
Dim ID As String = m.WParam.ToString()
Select Case ID
Case 0 : If DF1Com1.Write("O:1/0", "1") Then DF1Com1.Write("O:1/0", "0")
Case 1 : MessageBox.Show("S")
Case 2 : MessageBox.Show("D")
Case 3 : MessageBox.Show("F")
Case 4 : MessageBox.Show("G")
Case 5 : MessageBox.Show("H")
End Select
End If
MyBase.WndProc(m)
End Sub
如果你看一下案例0 。它可以工作,但它没有把钥匙放回去。它让它一直压下来。当钥匙被压下时,我需要它。DF1Com1.Write(" O:1/0"," 0")'
类代码
Public NotInheritable Class HotKeyRegistryClass
Private Declare Function RegisterHotKey Lib "user32.dll" (ByVal handle As IntPtr, ByVal id As Int32, ByVal fsModifier As Int32, ByVal vk As Int32) As Int32
Private Declare Function UnregisterHotKey Lib "user32.dll" (ByVal handle As IntPtr, ByVal id As Int32) As Int32
Private Handle As IntPtr = IntPtr.Zero
Private Registry As New System.Collections.Generic.List(Of Int32)
Public Enum Messages
[WM_HOTKEY] = &H312
End Enum
Public Enum Modifiers
[MOD_ALT] = &H1
[MOD_CTRL] = &H2
[MOD_SHIFT] = &H4
End Enum
Sub New(ByVal Handle As IntPtr)
Me.Handle = Handle
End Sub
Public Function Register(ByVal Modifier As Int32, ByVal Key As System.Windows.Forms.Keys) As Int32
Dim ret As Int32
ret = NextAvailableIndex()
Call RegisterHotKey(Me.Handle, ret, Modifier, Key)
Registry.Insert(ret, ret)
Return ret
End Function
Public Sub Unregister(ByVal ID As Int32)
Call UnregisterHotKey(Me.Handle, ID)
Registry.Remove(ID)
End Sub
Private Function NextAvailableIndex() As Int32
Dim ret As Int32 = 0
Dim n As Int32 = 0
For i As Int32 = 0 To Registry.Count - 1
If Registry(i) = n Then
n = n + 1
ElseIf n < Registry(i) Then
Return n
End If
Next
If n = Registry.Count Then
Return Registry.Count
End If
Return ret
End Function
End Class
答案 0 :(得分:1)
不幸的是,RegisterHotkey
只会告诉您何时激活了一个组合键。此外,正如您已经意识到的那样,您拥有的KeyDown
和KeyUp
事件仅在您的应用具有焦点时才会有效。
获得真正全局KeyDown
和KeyUp
的唯一方法是使用低级键盘钩子。由于我不想复制我的整个答案,我只想链接到它。该链接将为您提供设置键盘挂钩的一些方向。
How to disable/override Windows 10 Hotkeys with C#
另一种可能性是在热键激活上执行这两个命令,如...
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = HotKeyRegistryClass.Messages.WM_HOTKEY Then 'NOT THE ACTUAL WINDOWS NAMESPACE
Dim ID As String = m.WParam.ToString()
Select Case ID
Case 0 :
DF1Com1.Write("O:1/0", "1")
System.Threading.Thread.Sleep(2000)
DF1Com1.Write("O:1/0", "0")
Case 1 : MessageBox.Show("S")
Case 2 : MessageBox.Show("D")
Case 3 : MessageBox.Show("F")
Case 4 : MessageBox.Show("G")
Case 5 : MessageBox.Show("H")
End Select
End If
MyBase.WndProc(m)
End Sub
答案 1 :(得分:0)
实现此目的的另一个选择可能是使用布尔来跟踪。这样做意味着,按热键开始,然后再按一次停止。
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Static toggle As Boolean
If m.Msg = HotKeyRegistryClass.Messages.WM_HOTKEY Then 'NOT THE ACTUAL WINDOWS NAMESPACE
Dim ID As String = m.WParam.ToString()
Select Case ID
Case 0 :
If toggle Then
DF1Com1.Write("O:1/0", "0")
Else
DF1Com1.Write("O:1/0", "1")
End If
toggle = Not toggle
Case 1 : MessageBox.Show("S")
Case 2 : MessageBox.Show("D")
Case 3 : MessageBox.Show("F")
Case 4 : MessageBox.Show("G")
Case 5 : MessageBox.Show("H")
End Select
End If
MyBase.WndProc(m)
End Sub