Что нового

Как создать обычное окно с помощью _WinAPI_CreateWindowEx

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Вопрос возник из-за того, что выявился один баг с дочерними окнами.
Можно ли вообще создать окно, не использов Gui? На C++ достаточно громоздко выглядит.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можно, но зачем? Тебе придется обрабатывать все сообщения вручную. Делается это так же, как и на cpp.
 
Автор
K

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
А конфликтов не будет во время обработки сообщений?
Еще, кстати, нет функции _WinAPi_RegisterClass, чтобы это сделать. Придется её попробовать сделать.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Не пойму зачем изобретать велосипед?

Вы скажите какой у Вас баг с дочерним окном - а мы попробуем его решить.
 
Автор
K

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Вот тут добавил 3 дня назад:
http://www.autoitscript.com/trac/autoit/ticket/1797

Я не думаю, что можно как-то избежать этот баг.


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

Попробовал зарегистрировать класс, не получилось. Вываливается с ошибкой. Помогите пожалуйста, как нормально зарегистрировать этот класс.

Код:
#include <WinAPi.au3>
#include <WindowsConstants.au3>

Global Const $tagWNDCLASS = "int style; ptr lpfnWndProc; int cbClsExtra; int cbWndExtra; handle hInstance; handle hIcon; handle hCursor; handle hbrBackground; str lpszMenuName; str lpszClassName;"

MsgBox(0,"",_WinAPi_RegisterClass("MyClass"))

Func _WinApi_RegisterClass($WndClass)
	Local $CS_VREDRAW = 1
	Local $CS_HREDRAW = 2

	Local $wndproc = DLLCallbackRegister ("_WndProc", "long", "hWnd;iMsg;iWparam;ilParam;")

	Local $tWNDCLASS = DllStructCreate($tagWNDCLASS)
	DllStructSetData($tagWNDCLASS, "style", BitOR($CS_HREDRAW, $CS_VREDRAW) )
	DllStructSetData($tagWNDCLASS, "lpfnWndProc", DllCallbackGetPtr($wndproc) )
	DllStructSetData($tagWNDCLASS, "cbClsExtra", 0)
	DllStructSetData($tagWNDCLASS, "cbWndExtra", 0)
	DllStructSetData($tagWNDCLASS, "hInstance", _WinAPI_GetModuleHandle(0))
	DllStructSetData($tagWNDCLASS, "hIcon", 0)
	DllStructSetData($tagWNDCLASS, "hCursor", 0)
	DllStructSetData($tagWNDCLASS, "hbrBackground", _WinAPI_GetStockObject($WHITE_BRUSH))
	DllStructSetData($tagWNDCLASS, "lpszMenuName", "")
	DllStructSetData($tagWNDCLASS, "lpszClassName", $WndClass)

	Local $ret = DllCall("User32.dll", "long", "RegisterClass", "ptr", DllStructGetPtr($tWNDCLASS))
	Return $ret[0]
EndFunc

Func _WndProc($hWnd, $iMsg, $iWparam, $ilParam)
    return _WinAPI_DefWindowProc($hWnd, $iMsg, $iwParam, $ilParam)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
kzru_hunter сказал(а):
Я не думаю, что можно как-то избежать этот баг.

А зачем понадобилось создавать дочернее окно для чужого процесса, тем более для AutoIt окна? Я уже догадываюсь, что ответит на этот тикет Valik...
 
Автор
K

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Я там разместил как пример.
На самом деле надо в другом окне создавать дочернее окно.

Бывали случаи, что после завершении скрипта, процессор загружался до 100%
А если самому закрыть процесс, в окне которого создано дочернее окно, то в этом случае баг всегда себя проявит.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
kzru_hunter сказал(а):
На самом деле надо в другом окне создавать дочернее окно.

В другом окне, в смысле другом процессе? Если так, то какой от этого смысл? Они не будут взаимодействовать. В любом случае, вот я написал небольшой пример создания окна на WinAPI:

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

Global Const $IDC_ARROW = 32512

Global Const $tagWNDCLASSEX = 'uint Size;uint Style;ptr hWndProc;int ClsExtra;int WndExtra;ptr hInstance;ptr hIcon;ptr hCursor;ptr hBackground;ptr MenuName;ptr ClassName;ptr hIconSm'
Global Const $sClass = 'MyWindowClass'
Global Const $sName = 'MyProg'

$tWndClassEx = DllStructCreate($tagWNDCLASSEX)
$hWndProc = DllCallbackRegister('_MyWndProc', 'lresult', 'hwnd;uint;wparam;lparam')
$hInstance = _WinAPI_GetModuleHandle(0)
$hCursor = _WinAPI_LoadCursor(0, $IDC_ARROW)
$tIcon = DllStructCreate('ptr;ptr')
_WinAPI_ExtractIconEx('shell32.dll', 130, DllStructGetPtr($tIcon, 1), DllStructGetPtr($tIcon, 2), 1)
$hBrush = _WinAPI_CreateSolidBrush(_WinAPI_GetSysColor($COLOR_3DFACE))
$tClass = DllStructCreate('wchar[' & StringLen($sClass) + 1 & ']')
DllStructSetData($tClass, 1, $sClass)

DllStructSetData($tWndClassEx, 'Size', DllStructGetSize($tWndClassEx))
DllStructSetData($tWndClassEx, 'Style', 0)
DllStructSetData($tWndClassEx, 'hWndProc', DllCallbackGetPtr($hWndProc))
DllStructSetData($tWndClassEx, 'ClsExtra', 0)
DllStructSetData($tWndClassEx, 'WndExtra', 0)
DllStructSetData($tWndClassEx, 'hInstance', $hInstance)
DllStructSetData($tWndClassEx, 'hIcon', DllStructGetData($tIcon, 1))
DllStructSetData($tWndClassEx, 'hCursor', $hCursor)
DllStructSetData($tWndClassEx, 'hBackground', $hBrush)
DllStructSetData($tWndClassEx, 'MenuName', 0)
DllStructSetData($tWndClassEx, 'ClassName', DllStructGetPtr($tClass))
DllStructSetData($tWndClassEx, 'hIconSm', DllStructGetData($tIcon, 2))

DllCall('user32.dll', 'dword', 'RegisterClassExW', 'ptr', DllStructGetPtr($tWndClassEx))
$hWnd = DllCall('user32.dll', 'hwnd', 'CreateWindowExW', 'dword', 0, 'wstr', $sClass, 'str', $sName, 'dword', BitOR($WS_CAPTION, $WS_POPUPWINDOW, $WS_VISIBLE), 'int', 200, 'int', 200, 'int', 400, 'int', 400, 'hwnd', 0, 'hwnd', 0, 'hwnd', $hInstance, 'ptr', 0)
$hWnd = $hWnd[0]

$Exit = 0

While 1
	Sleep(100)
	If $Exit Then
		ExitLoop
	EndIf
WEnd

DllCall('user32.dll', 'dword', 'UnregisterClassW', 'wstr', $sClass, 'ptr', $hInstance)
DllCallbackFree($hWndProc)

_WinAPI_DestroyCursor($hCursor)
For $i = 1 To 2
	_WinAPI_DestroyIcon(DllStructGetData($tIcon, $i))
Next

Func _MyWndProc($hWnd, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case $WM_CLOSE
			$Exit = 1
	EndSwitch
	Return _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_MyWndProc
 
Автор
K

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Yashied Большое спасибо :IL_AutoIt_1:
В другом окне, в смысле другом процессе? Если так, то какой от этого смысл? Они не будут взаимодействовать
Мне надо было просто отобразить в окне другого процесса дочернее окно.
 
Верх