Что нового

[Элементы GUI] Изменить класс окна GUI

Nelsy

Знающий
Сообщения
35
Репутация
8
Можно ли изменить класс элементов gui средствами autoit или же используя библиотеки windows?

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 256, 192, 192, 124)
_GUICtrlSetClass($Form1,'Main window') ; по дефолту AutoIt v3 GUI
$Button1 = GUICtrlCreateButton("Button1", 56, 80, 75, 25)
$Input1 = GUICtrlCreateInput("Input1", 64, 16, 121, 21)
$Label1 = GUICtrlCreateLabel("Label1", 64, 48, 36, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Func _GUICtrlSetClass($hWnd,$class)
	; меняем Class
EndFunc
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
Если поставить бряк на функцию USER32.RegisterClassExW и сделать фильтр [ESP+38]=UNICODE "Autoit v3 GUI" то можно заменить данную строчку. Выглядеть это будет примерно так:

Код:
_SetOnBreakpoint("_GUICtrlSetClass()")
	; устанавливаем функ. которой будем обрабатываеть срабатывание брякпонта
$bp = _SetBreakpoint("USER32.RegisterClassExW") ; устанавливаем бряк
$Form1 = GUICreate("Form1", 256, 192, 192, 124)
_DelBreakpoint($bp) ; деактивируем бряк
$Button1 = GUICtrlCreateButton("Button1", 56, 80, 75, 25)
$Input1 = GUICtrlCreateInput("Input1", 64, 16, 121, 21)
$Label1 = GUICtrlCreateLabel("Label1", 64, 48, 36, 17)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
	if $nmsg=$gui_event_close then exit
WEnd

Func _GUICtrlSetClass()
    ; Ставим бряк на функцию USER32.RegisterClassExW
	; Создаем фильтр аля If [ESP+39] <> "AutoIt v3 GUI" Then Return
	; В случае если совпадение найдено - меняем строку на нашу
EndFunc


Какие у вас мысли по этому поводу?
Возможно проще написать функцию поиска в памяти процесса строчку Autoit v3 GUI и заменить ее на нашу.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
На счёт как изменить класс - не знаю, но знаю что возможно создать своё окно с другим классом:

Пример от Yashied'a

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

Global Const $IDC_ARROW = 32512

Global Const $toWNDCLASSEX = '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 = 'Window_class'
Global Const $sName = 'Моя программа'

$tWndClassEx = DllStructCreate($toWNDCLASSEX)
$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


Но учтите всё остальное включая контролы и т.д. и т.п. придётся делать так же на WinAPI.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Nelsy

А чем напрягает класс "AutoIt v3 GUI"? Но если очень хочется, то можешь изменить название с помощью любого HEX редактора.
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
все это дохлый номер, прежде чем начать выполнение скрипта аутоит регистрирует классы не зависимо от того будешь ты их использовать или нет. и если попытаться что то изменить то аутоит просто не сможет создать никакого гуй =( Жаль...
 
Верх