SetWindowsHookEx mit WH_CALLWNDPROC
Verfasst: 14.08.2007 14:07
Ich hab folgendes Problem:
Ich möchte eine eigene Uhr bzw. Timer im Systray anzeigen lassen, oder evtl. die Uhr von Windows (XP) ersetzten. Hier in diesem Thread wurde so ein ähnliches Thema mal angesprochen, hat mir aber nicht viel geholfen.
Ich hab es mit einer DLL-Injektion Probiert, nach dem Prinzip, wie auch der Taskmanager unter XP abgeschaltet werden kann, aber das funktioniert auch nicht.
Nun hab ich ein Beispiel gefunden, welches genau das tut was ich auch will, und hab mir dazu dann den C-Code angeschaut und bin zu dem Entschluss gekommen, dass es mit Hilfe der SetWindowsHookEx_() Funktion gehen muss. Hier der Link von dem C-Code
Nun hab ich darauf folgenden Code geschrieben:
Dieser Code sollte mir nur zeigen ob es Funktioniert und ich die CallBack-Funktion von der Uhr abfangen kann oder nicht, jedoch wird beim start dieses Codes der Explorer geschlossen und neugestartet. Das gleiche ist auch bei der DLL-Injektion gewesen. Aber warum das so ist und wieso das nicht funktioniert hab ich nicht herausgefunden und mit einer DLL hab ich es auch nicht geschafft das ganze zum laufen zu bringen.
Wenn einer von euch mir sagen könnte, wo mein Fehler ist, wäre das super. Zerbreche mir schon die ganze Zeit den Kopf darüber woran es liegen könnte, aber ich komm einfach nicht drauf.
Ich möchte eine eigene Uhr bzw. Timer im Systray anzeigen lassen, oder evtl. die Uhr von Windows (XP) ersetzten. Hier in diesem Thread wurde so ein ähnliches Thema mal angesprochen, hat mir aber nicht viel geholfen.
Ich hab es mit einer DLL-Injektion Probiert, nach dem Prinzip, wie auch der Taskmanager unter XP abgeschaltet werden kann, aber das funktioniert auch nicht.
Nun hab ich ein Beispiel gefunden, welches genau das tut was ich auch will, und hab mir dazu dann den C-Code angeschaut und bin zu dem Entschluss gekommen, dass es mit Hilfe der SetWindowsHookEx_() Funktion gehen muss. Hier der Link von dem C-Code
Nun hab ich darauf folgenden Code geschrieben:
Code: Alles auswählen
#TCM_CLOCKERROR = #WM_USER + 1
#CLOCKM_EXIT = #WM_USER + 9
Global g_hhook.l = #Null
Global g_hwndTClockMain.l = #Null
Global g_hInst.l = GetModuleHandle_(0)
Procedure.l MyWnd(hwnd, message, wParam, lParam)
Debug "MyWnd"
ProcedureReturn DefWindowProc_(hwnd, message, wParam, lParam)
EndProcedure
Procedure.l HookStart()
hwndTaskbar.l = FindWindow_("Shell_TrayWnd", "")
hwndTray.l = FindWindowEx_(hwndTaskbar, #Null, "TrayNotifyWnd", "")
g_hwndClock.l = FindWindowEx_(hwndTray, #Null, "TrayClockWClass", #Null)
idThread.l = GetWindowThreadProcessId_(hwndTaskbar, #Null)
g_hhook = SetWindowsHookEx_(#WH_CALLWNDPROC, @MyWnd(), g_hInst, idThread)
If hwndTaskbar And hwndTray And g_hwndClock And idThread And g_hhook
PostMessage_(hwndTaskbar, #WM_SIZE, #SIZE_RESTORED, 0)
ProcedureReturn #True
EndIf
SendMessage_(hwndMain, #TCM_CLOCKERROR, 0, 5)
ProcedureReturn #False
EndProcedure
Procedure HookEnd()
If g_hwndTClockMain And IsWindow_(g_hwndTClockMain)
SendMessage_(g_hwndTClockMain, #CLOCKM_EXIT, 0, 0)
EndIf
If(g_hhook <> #Null)
UnhookWindowsHookEx_(g_hhook)
EndIf
g_hhook = #Null
EndProcedure
OpenWindow(1, 0,0, 200, 200, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
g_hwndTClockMain = WindowID(1)
HookStart()
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
HookEnd()
Wenn einer von euch mir sagen könnte, wo mein Fehler ist, wäre das super. Zerbreche mir schon die ganze Zeit den Kopf darüber woran es liegen könnte, aber ich komm einfach nicht drauf.
