Как я могу проверить, находится ли определенный процесс в фокусе?

Я пытаюсь проверить, есть ли у javaw.exe фокус, а затем выполнить определенный код, если это так.

Ранее у меня был код, который ищет идентификатор процесса javaw.exe, затем сравнивает его с процессом, который в настоящее время имеет фокус, который работал некоторое время, но затем я заметил, что когда у меня запущено более одного процесса javaw.exe, он работать только над одним из этих процессов, в то время как он мне нужен, когда любой процесс javaw.exe находится в фокусе.

Есть какой-либо способ сделать это?

1 ответ

Решение

Вы можете определить это довольно легко, используя GetForegroundWindow() а также GetWindowThreadProcessId() WinAPI функции.

Первый звонок GetForegroundWindow чтобы получить дескриптор окна текущего окна, затем вызовите GetWindowThreadProcessId для того, чтобы получить идентификатор процесса этого окна. Наконец получить его как 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

Надеюсь это поможет!

Другие вопросы по тегам