Что нового

Активация окна по названию процесса

SergVrn

Новичок
Сообщения
87
Репутация
2
Всем привет !
Помогите разобраться.

Есть код, который вроде бы должен делать активным - окно с определенным названием пройесса.
Но он - не работает.
У меня открыто четыре программы TotalCommander - и этот файл делает активным окна - не по названию процесса, а по каким-то другим критериям.
Возможно определение окна идет по PID, но он у всех четырех окон одинаковый.
То есть код находит процесс с определенным названием, определяет его PID, но делает активным - не то окно.
Код:
#include <WinAPIEx.au3>

$sProg = "TOTALCMD64-4.EXE"
If Not ProcessExists($sProg) Then MsgBox(0,'','Процесс не существует')
$sTitl = _WinGetForProc($sProg)
WinSetState($sTitl,'',@SW_SHOW)
WinActivate($sTitl)


Func _WinGetForProc($sProcName)
    $alist = ProcessList($sProcName)
    For $i = 1 To $alist[0][0]
        $iProcPid = $alist[$i][1]
    Next
    $aData = _WinAPI_EnumProcessWindows($iProcPid, 1)
    $iWin = $aData[1][0]
    $sTitle = WinGetTitle($iWin)
    Return $sTitle
EndFunc   ;==>_WinGetForProc

Подскажите - как изменить этот код, чтобы он сделал активным окно с определенным названием процесса ?
 
A

Alofa

Гость
Код:
#include <WinAPIEx.au3>

$sProg = "TOTALCMD64.EXE"
$hWnd = _WinGetForProc($sProg, 'TTOTAL_CMD') ; Второй параметр это Класс окна, если его не указать, то вы получите информацию о всех окнах процесса
If @error = 1 Then Exit MsgBox(262144 + 16, Default, 'Процесс не существует')

WinSetState($hWnd, '', @SW_SHOW)
WinActivate($hWnd)
If (Not WinActive($hWnd) Or Not BitAND(WinGetState($hWnd), 2)) And (Not IsAdmin()) Then MsgBox(262144 + 16, Default, 'Запустите скрипт От Имени Администратора')
_WinGetForProc($sProg) ; Тест

Func _WinGetForProc($sProcName, $vWinClass = False)
	Local $iPID = ProcessExists($sProcName)
	If Not $iPID Then Return SetError(1, 0, 0)
	
	Local $aData = _WinAPI_EnumProcessWindows($iPID, False) ; Если вы не хотите принимать во внимание свернутые окна, тогда ставьте "True"
	If @error Then Return SetError(2, 0, 0)
	
	If $vWinClass Then
		For $i = 1 To $aData[0][0]
			If $aData[$i][1] == $vWinClass Then Return $aData[$i][0]
		Next
	Else
		Local $sText = 'Всего количество окон процесса: ' & $sProcName & ' = ' & $aData[0][0] & @CR
		$sText &= 'Handle:		| Class:' & @CR & '---------------------------------------------' & @CR
		For $i = 1 To $aData[0][0]
			$sText &= $aData[$i][0] & '	| ' & $aData[$i][1] & @CR
		Next
		$sText &= '---------------------------------------------' & @CR & _
				'(Скрипт будет остановлен!)' & @CR & 'Хотите скопировать текст данного окна в Буфер обмена?'
		If MsgBox(262144 + 64 + 4, 'Func _WinGetForProc()', $sText) = 6 Then ClipPut($sText)
		Exit
	EndIf
	Return SetError(3, 0, 0)
EndFunc   ;==>_WinGetForProc
 
Верх