Nun, ich möchte eine UDF schreiben (Ich hatte das Problem aber schon mehrmals).
Dazu muss ich auf WM_NOTIFY und WM_COMMAND reagieren. An sich ja kein Problem. Einfach GuiRegisterMSG und fertig... Allerdings ist das in UDFs ja nicht einfach Möglich, da der Nutzer der UDF ja ggf. selbst auch auf diese Messages reagieren möchte. Dabei wird dann ja das vorherige GuiRegisterMSG überschrieben.
Bisher hatte ich das so gelöst, dass der Nutzer die Message registrieren muss und dort dann meine Funktion aufruft (oder diese registriert).
Ich hatte bereits auch mehrfach versucht, die Messages zu hooken. Nun hab ich mich wiedermal drangesetzt und hab nach Stunden immernoch keine Lösung...
Meine Versuche:
_WinAPI_SetWindowsHookEx mit $WH_CALLWNDPROC, $WH_CALLWNDPROCRET, $WH_GETMESSAGE
_WinAPI_RegisterShellHookWindow
_WinAPI_SetWinEventHook
Die verschiedenen Hooks hab ich in verschiedensten Varianten durchprobiert... leider ohne gewünschtes Ergebnis...
Eigentlich sollte ja $WH_CALLWNDPROC reagieren, dort passiert allerdings nicht.
Das Momentane Script:
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.14.2
Author: Kanasius
Script Function:
Generate Dynamic Guis
#ce ----------------------------------------------------------------------------
;Function Parameter: https://msdn.microsoft.com/en-us/library/windows/desktop/dd373885(v=vs.85).aspx
;EVENTSIDE: https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx
;CONSTANTS: https://msdn.microsoft.com/en-us/library/windows/desktop/dd318066(v=vs.85).aspx
#include <WinAPISys.au3>
#include <WinAPI.au3>
Global $__DynamicGui_hEventProc,$__DynamicGui_hEventHook,$__DynamicGui_Guis[0]
global $iWidth=800,$iHeight=600
__DynamicGui_Init()
$hGui=GUICreate("",$iWidth,$iHeight)
GUICtrlCreateButton("test",5,5)
GUICtrlCreateListView("col",5,50,$iHeight-60,$iWidth-10)
GUISetState()
__DynamicGui_InitGui($hGui)
while sleep(10)
$iMsg=GUIGetMsg()
Switch $iMsg
Case -3
_close()
EndSwitch
WEnd
Func _close()
__DynamicGui_Shutdown()
exit
EndFunc
Func __DynamicGui_InitGui($hWnd)
ReDim $__DynamicGui_Guis[UBound($__DynamicGui_Guis)+1]
$__DynamicGui_Guis[UBound($__DynamicGui_Guis)-1]=$hWnd
EndFunc
Func __DynamicGui_Init()
$__DynamicGui_hEventProc = DllCallbackRegister("__DynamicGui_CALLWNDProc", "long", "int;wparam;lparam")
local $hMod = _WinAPI_GetModuleHandle(0)
Local $__DynamicGui_hEventHook = _WinAPI_SetWindowsHookEx($WH_CALLWNDPROC,DllCallbackGetPtr($__DynamicGui_hEventProc),$hMod)
EndFunc
Func __DynamicGui_Shutdown()
_WinAPI_UnhookWindowsHookEx($__DynamicGui_hEventHook)
DllCallbackFree($__DynamicGui_hEventProc)
EndFunc ;==>Cleanup
Func __DynamicGui_CALLWNDProc($nCode, $wParam, $lParam)
ConsoleWrite($nCode&@crlf)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($__DynamicGui_hEventHook, $nCode, $wParam, $lParam)
EndIf
;for $i=0 to UBound($__DynamicGui_Guis)-1 step 1
;if $hWnd=$__DynamicGui_Guis[$i] or _WinAPI_GetParent($hWnd)=$__DynamicGui_Guis[$i] then
; ConsoleWrite($iEvent&": "&$hWnd&@crlf)
;endif
;next
Return _WinAPI_CallNextHookEx($__DynamicGui_hEventHook, $nCode, $wParam, $lParam)
EndFunc
Alles anzeigen
Ich hab auch schon einiges in MSDN gelesen. Aber eine Erklärung, warum $WH_CALLWNDPROC nicht funktioniert wie erwartet, habe ich nicht gefunden.
Ich hoffe einer von euch kann mir helfen, auf das ich dieses lästige Problem beseitigen kann
MfG Kanashius