Что нового

Окно открытого процесса в GUI окне

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Как правильно разместить окно открытого процесса в своём GUI окне? я тут что - то написал, в принципе размещает и работает, но окно открытого процесса больше не прорисовывается, наверное нужно обработку сообщений своего окна прикрутить к открытому через _WinAPI_SetWindowLong()?

Код:
#include <WindowsConstants.au3>
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

$GUI = GUICreate("FORM",800 ,600)
GUISetState()

$PID = Run("notepad.exe")
ProcessWait("notepad.exe")
$hWin = WinGetHandleEx($PID)

_WinAPI_SetParent($hWin, $GUI)
_WinAPI_SetWindowLong($hWin, $GWL_HWNDPARENT, $GUI)
_WinAPI_SetWindowPos($hWin, $HWND_BOTTOM, 20, 20, 500, 400, BitOR($SWP_NOACTIVATE, $SWP_NOZORDER))

While 1
    Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch		
WEnd

Func WinGetHandleEx($iPID)
    If IsString($iPID) Then $iPID = ProcessExists($iPID)
    
    Local $aWList = WinList("[REGEXPTITLE:(?i).*.*]")
    If @error Then Return SetError(1, 0, "")
    
    For $i = 1 To $aWList[0][0]
        If WinGetProcess($aWList[$i][1]) = $iPID Then
			Return $aWList[$i][1]
        EndIf
    Next
    
    Return SetError(2, 0, "")
EndFunc
 

Zaramot

I ♥ AutoIt
Сообщения
1 160
Репутация
658
Gregaz, подымал похожую тему:
http://autoit-script.ru/index.php/topic,6506.0.html
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Мне нужно открыть окно как оно есть а не эмулировать открытый процесс, у меня оно в GUI будет открыто не одно, а значит мне их нужно перемещать, то есть сделать свой GUI родительским для открытых процессов


Добавлено:
Сообщение автоматически объединено:

В принципе тут всё сделано, единственная проблема с прорисовкой открытого окна
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
Сначала обои повесил, теперь окна засовываешь... Эмулируешь Рабочий стол? :rofl:

Кстати, если любое окно из твоего autoit'ного рабочего стола создаст окно - оно не будет создано в твоем рабочем столе.
Например, запусти свой код выше и открой окно О программе или Сохранить как - они все откоются не в твоем autoit'овском рабочем столе а в реальном.

Мне вот интересно, зачем тебе все это?
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
OffTopic:
Здесь ответы, решения или примеры на поставленные задачи пишут, если хочешь пообщатся, пиши в личку.
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
OffTopic:
Во-первых, это форум, а не ответник. Во-вторых, я тебя по сабжу спрашиваю. В-третьих, возможно не мне одному это будет интересно узнать. В-четвертых, в Правилах не сказано, что сообщения обязаны содержать ответ, решение или пример. Если ты так считаешь, то удаляй своих два последних сообщения и напиши их каждому в личку.
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Конкретно по:

Кстати, если любое окно из твоего autoit'ного рабочего стола создаст окно - оно не будет создано в твоем рабочем столе.
Например, запусти свой код выше и открой окно О программе или Сохранить как - они все откоются не в твоем autoit'овском рабочем столе а в реальном.

Мне вот интересно, зачем тебе все это?
Так лучше будет?

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $hDesktop, $hPrev, $pText, $tProcess, $tStartup

; Retrieve a handle to the current desktop and create a new desktop named "MyDesktop"
$hPrev = _WinAPI_GetThreadDesktop(_WinAPI_GetCurrentThreadID())
$hDesktop = _WinAPI_CreateDesktop('MyDesktop', BitOR($DESKTOP_CREATEWINDOW, $DESKTOP_SWITCHDESKTOP))
If Not $hDesktop Then
    MsgBox(16, 'Error', 'Unable to create desktop.')
    Exit
EndIf

; Switch to the newly created desktop
_WinAPI_SwitchDesktop($hDesktop)

; Run "calc.exe" on "MyDesktop" and wait until a process will not be closed by user
$pText = _WinAPI_CreateString('MyDesktop')
$tProcess = DllStructCreate($tagPROCESS_INFORMATION)
$tStartup = DllStructCreate($tagSTARTUPINFO)
DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
DllStructSetData($tStartup, 'Desktop', $pText)
If _WinAPI_CreateProcess('', @SystemDir & '\calc.exe', 0, 0, 0, $CREATE_NEW_PROCESS_GROUP, 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then
    ProcessWaitClose(DllStructGetData($tProcess, 'ProcessID'))
EndIf

; Switch to previous desktop and close "MyDesktop"
_WinAPI_SwitchDesktop($hPrev)
_WinAPI_CloseDesktop($hDesktop)

; Free memory allocated for a string
_WinAPI_FreeMemory($pText)


Окно теперь нормально работает и прорисовывается, единственное но, для его нормальной работы требуется применить стиль $WS_CHILD, из за чего пропадает меню в открывшемся окне...

Код:
#include <WindowsConstants.au3>
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

$GUI = GUICreate("FORM",800 ,600)
GUISetState()

$PID = Run("notepad.exe")
ProcessWait("notepad.exe")
$hWin = WinGetHandleEx($PID)


$hWnd = _WinAPI_SetParent($hWin, $GUI)
_WinAPI_SetWindowLong($hWin, -16, BitOR(_WinAPI_GetWindowLong($hWin, -16), $WS_CHILD))
_WinAPI_SetWindowLong($hWin, -20, BitOR(_WinAPI_GetWindowLong($hWin, -20), $WS_EX_MDICHILD))
_WinAPI_SetWindowLong($hWin, $GWL_HWNDPARENT, $GUI)
_WinAPI_SetWindowPos($hWin, $HWND_BOTTOM, 20, 20, 500, 400, BitOR($SWP_NOACTIVATE, $SWP_NOZORDER))

While 1
    Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch		
WEnd

Func WinGetHandleEx($iPID)
    If IsString($iPID) Then $iPID = ProcessExists($iPID)
    
    Local $aWList = WinList("[REGEXPTITLE:(?i).*.*]")
    If @error Then Return SetError(1, 0, "")
    
    For $i = 1 To $aWList[0][0]
        If WinGetProcess($aWList[$i][1]) = $iPID Then
			Return $aWList[$i][1]
        EndIf
    Next
    
    Return SetError(2, 0, "")
EndFunc
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
В описании структуры $tagSTARTUPINFO сказано что окно нового процесса можно разместить и в обычном окне "Инфо", как это сделать, в параметр Desktop нужно ввести рабочую станцию для создаваемого процесса, а вводимый тип в Desktop - ptr.

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Global $tSTARTUPINFO = "dword Size;ptr Reserved1;ptr Desktop;ptr Title;dword X;dword Y;dword XSize;dword YSize;dword XCountChars;" & _
		"dword YCountChars;dword FillAttribute;dword Flags;word ShowWindow;word Reserved2;ptr Reserved3;handle StdInput;" & _
		"handle StdOutput;handle StdError"
		
$GUI = GUICreate("FORM",800 ,600)
GUISetState()


$tProcess = DllStructCreate($tagPROCESS_INFORMATION)
$tStartup = DllStructCreate($tSTARTUPINFO)
DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
DllStructSetData($tStartup, 'Desktop', 0)
If _WinAPI_CreateProcess('', @SystemDir & '\calc.exe', 0, 0, 0, $CREATE_NEW_PROCESS_GROUP, 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then
    ProcessWaitClose(DllStructGetData($tProcess, 'ProcessID'))
EndIf
 
Верх