gpt4 book ai didi

vb.net - 如何检查某个进程是否有焦点?

转载 作者:行者123 更新时间:2023-12-04 14:27:50 24 4
gpt4 key购买 nike

我正在尝试检查 javaw.exe 是否具有焦点,如果是,则执行某些代码。

以前我有一些代码会查找 javaw.exe 的进程 ID,然后将它与当前具有焦点的进程进行比较,该进程工作了一段时间,但后来我注意到当我运行多个 javaw.exe 进程时,它会只在这些进程之一上工作,而当任何 javaw.exe 进程有焦点时,我需要它工作。

有没有办法做到这一点?

最佳答案

您可以使用 GetForegroundWindow() 轻松确定这一点。和 GetWindowThreadProcessId() WinAPI 函数。

第一个电话GetForegroundWindow获取当前聚焦窗口的窗口句柄,然后调用 GetWindowThreadProcessId为了检索该窗口的进程ID。最后得到它作为 Process class实例通过调用 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

希望这可以帮助!

关于vb.net - 如何检查某个进程是否有焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41880266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com