om binnen een app te kijken of de gebruiker nog wakker is heb een simpel objectje gemaakt dat een keyboard en mousehook maakt, in de callback een postmessage doet, en zo een event naar buiten stuurt.
Niet echt spannend allemaal en het lijkt dan ook fluitend te werken.
Behalve als ik met de muis op een TMenuItem klik. Dan lijkt de main thread ineens geen messages meer te verwerken. Als ik naar een andere app switch en weer terug (met alt-tab of muis) gaat de boel weer lopen.
Dit probleem lijkt zich nergens anders voor te doen, alleen bij een TMenuItem.
Volgens google ben ik alleen op de wereld met dit probleem ...
voorbeeld exe + source staat hier http://www.xs4all.nl/~bosma/HookProblems.zip
ook nog wat stukjes code:
Niet echt spannend allemaal en het lijkt dan ook fluitend te werken.
Behalve als ik met de muis op een TMenuItem klik. Dan lijkt de main thread ineens geen messages meer te verwerken. Als ik naar een andere app switch en weer terug (met alt-tab of muis) gaat de boel weer lopen.
Dit probleem lijkt zich nergens anders voor te doen, alleen bij een TMenuItem.
Volgens google ben ik alleen op de wereld met dit probleem ...
voorbeeld exe + source staat hier http://www.xs4all.nl/~bosma/HookProblems.zip
ook nog wat stukjes code:
Delphi:
1
| fMouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetWindowThreadProcessId(Application.Handle)); |
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| function MouseProc(nCode: integer; wParam: wParam; lParam: lParam): LRESULT; stdcall; var Activity: TActivityType; begin if nCode >= 0 then begin Activity := atNone; case wParam of // WM_MOUSEMOVE: Activity := atMouseMove; WM_LBUTTONDOWN..WM_MBUTTONDBLCLK: Activity := atMouseClick; end; if Activity <> atNone then PostMessage(fMessageHandle, fWM_HOOK_CALLBACK, integer(Activity), lparam); end; result := CallNextHookEx(fMouseHook, nCode, wParam, lParam); end; |
Delphi:
1
2
3
4
5
6
7
8
9
10
| procedure TDetectUserActivity.MessageHandler(var Message: TMessage); begin if Message.Msg = fWM_HOOK_CALLBACK then begin if assigned(fOnActivity) then fOnActivity(Self, TActivityType(Message.WParam)); end else Message.result := DefWindowProc(fMessageHandle, Message.Msg, Message.wParam, Message.LParam); end; |
A software developer is someone who looks both left and right when crossing a one-way street.