我已经完成了制作一些sendkeys应用程序以帮助我让生活变得更轻松,但是当我切换窗口并且忘记关闭发送键时,我很烦恼,例如,我的应用程序将发送“123123”到记事本(当前活动应用程序),直到我停止它,所以当我切换到msword它将无法工作,然后如果我再次切换回记事本它将再次发送密钥,这可能吗?生活,如果有一些论点,如
If activeWindows = notepad.exe then
do this
Else
do nothing
End If
这只是一个想法,但我不知道如何在vb.net中制作类似的东西,我想使用.exe而不是应用程序的标题因为我认为它非常适合我正在做的事情。
事先提前答案 0 :(得分:0)
是的,它应该有用,好主意。到目前为止我所做的是读取numLock键。只要它打开,带有sendkeys的计时器就会触发。一旦关闭,计时器也将停止。但是添加对当前焦点的检查将是一个很好的补充。
使用哪种方法,请检查一下,我认为它符合How do I find the program with the current focus?
答案 1 :(得分:0)
您可以使用GetForegroundWindow
和GetWindowThreadProcessId
API为您执行此操作。这是一个简单的例子:
''' <summary>The GetForegroundWindow function returns a handle to the foreground window.</summary>
''' <returns>The return value is a handle to the foreground window. The foreground window can be NULL in certain circumstances, such as when a window is losing activation. </returns>
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetForegroundWindow() As IntPtr
End Function
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, _
ByRef lpdwProcessId As Integer) As Integer
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Task.Run(AddressOf KeySender)
End Sub
Private Sub KeySender()
While (True)
Dim fgWin = GetForegroundWindow()
Dim fgPid As New Integer()
GetWindowThreadProcessId(fgWin, fgPid)
Dim proc = System.Diagnostics.Process.GetProcessById(fgPid)
Console.WriteLine(proc.ProcessName)
If (proc.ProcessName = "notepad") Then
SendKeys.SendWait("A")
End If
System.Threading.Thread.Sleep(1000)
End While
End Sub