Что нового

Получение дескриптора процесса по дескриптору его окна

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
AutoIt: 3.3.8.1+
Версия: 1.0

Категория: Процессы, Окна

Описание: Раньше использовал для получения дескриптора процесса по дескриптору его окна связку WinGetHandle() (WinWait()) --> WinGetProcess() --> _WinAPI_OpenProcess(). Случайно обнаружил на MSDN, что есть такая API-функция.

Код/Пример:
Код:
Opt('MustDeclareVars', 1)

Global $hWnd, $hProcess

Run(@AutoItExe & ' /AutoIt3ExecuteLine "MsgBox(64, ''Test Script'', ''Test'')"')

$hWnd = WinWait('[Title:Test Script;Class:#32770]', '', 3)
If Not $hWnd Then Exit ConsoleWrite('Error wait window' & @LF) * 0 + 1

$hProcess = _WinAPI_GetProcessHandleFromHwnd($hWnd)
If @error Then Exit ConsoleWrite('Error _WinAPI_GetProcessHandleFromHwnd' & @LF) * 0 + 2
ConsoleWrite('Process handle: ' & $hProcess & @LF)


; #FUNCTION# ====================================================================================================
; Name...........: _WinAPI_GetProcessHandleFromHwnd
; Description....: Возвращает дескриптор процесса по дескриптору его окна.
; Syntax.........: _WinAPI_GetProcessHandleFromHwnd($h_Wnd)
; Parameters.....: $h_Wnd - десриптор окна процесса.
; Return values..: Дескриптор процесса.
; Author.........: madmasles
; Remarks........: Возвращенный дескриптор обладает следующими правами доступа:
;                  BitOR($PROCESS_DUP_HANDLE, $PROCESS_VM_OPERATION, $PROCESS_VM_READ, $PROCESS_VM_WRITE, $SYNCHRONIZE)
;                  см. https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx
; Link...........: http://autoit-script.ru/index.php?topic=19034, https://msdn.microsoft.com/en-us/library/windows/desktop/dd318087(v=vs.85).aspx
; Example........: Есть
; ===============================================================================================================
Func _WinAPI_GetProcessHandleFromHwnd($h_Wnd)
	Local $a_Res = DllCall('oleacc.dll', 'handle', 'GetProcessHandleFromHwnd', 'hwnd', $h_Wnd)
	If (@error) Or (Not $a_Res[0]) Then Return SetError(1, 0, 0)
	Return $a_Res[0]
EndFunc   ;==>_WinAPI_GetProcessHandleFromHwnd

Источник: autoit-script.ru, MSDN
Автор: madmasles
 
Верх