我正在尝试检查 javaw.exe 是否有焦点,如果有,则执行某些代码。
以前我的代码会查找 javaw.exe 的进程 ID,然后将其与当前具有焦点的进程进行比较,该进程工作了一段时间,但后来我注意到当我有多个 javaw.exe 进程运行时,它会只在其中一个进程上工作,而当任何 javaw.exe 进程有焦点时我需要它工作。
有没有办法做到这一点?
我正在尝试检查 javaw.exe 是否有焦点,如果有,则执行某些代码。
以前我的代码会查找 javaw.exe 的进程 ID,然后将其与当前具有焦点的进程进行比较,该进程工作了一段时间,但后来我注意到当我有多个 javaw.exe 进程运行时,它会只在其中一个进程上工作,而当任何 javaw.exe 进程有焦点时我需要它工作。
有没有办法做到这一点?
GetForegroundWindow()
您可以使用和GetWindowThreadProcessId()
WinAPI 函数很容易地确定这一点。
首先调用GetForegroundWindow
以获取当前聚焦窗口的窗口句柄,然后调用GetWindowThreadProcessId
以检索该窗口的进程 ID。最后通过调用将其作为Process
类实例获取Process.GetProcessById()
Public NotInheritable Class ProcessHelper
Private Sub New() 'Make no instances of this class.
End Sub
<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 UInteger) As Integer
End Function
Public Shared Function GetActiveProcess() As Process
Dim FocusedWindow As IntPtr = GetForegroundWindow()
If FocusedWindow = IntPtr.Zero Then Return Nothing
Dim FocusedWindowProcessId As UInteger = 0
GetWindowThreadProcessId(FocusedWindow, FocusedWindowProcessId)
If FocusedWindowProcessId = 0 Then Return Nothing
Return Process.GetProcessById(CType(FocusedWindowProcessId, Integer))
End Function
End Class
使用示例:
Dim ActiveProcess As Process = ProcessHelper.GetActiveProcess()
If ActiveProcess IsNot Nothing AndAlso _
String.Equals(ActiveProcess.ProcessName, "javaw", StringComparison.OrdinalIgnoreCase) Then
MessageBox.Show("A 'javaw.exe' process has focus!")
End If
希望这可以帮助!