SetWindowsHook Global not very Global

444 views Asked by At

I'm playing around with SetWindowsHookEx, specifically I would like be able to find out about any window (on my desktop) thats been activated, via mouse or keyboard.

Reading through MSDN docs for SetWindowsHookEx it would appear that a WH_CBT type would do the job. I've created a dll and put all the code in there, which I control from a gui app (which also handles the unhook).

BUT I only appear to be getting the activation code when I activate my gui app though, any other app I activate is ignored.

In my dll I have the setup code and the CBTProc like so:

LRESULT WINAPI CBTProc(int Code, WPARAM W, LPARAM L) {
   if(Code<0) CallN....

   if (Code == HCBT_ACTIVATE) { // never get unless I activate my app
      HWND a = reinterpret_cast<HWND>(W);
      TRACE("this window was activated %d\n", a);
   }

   CallNext....
}

EXPORTED HHOOK WINAPI Setup(HWND MyWind) {
   ...
   // gDllUInstance set in dllmain
   return SetWindowsHookEx(WH_CBT, CBTProc, gDllUInstance, 0);
}

All pretty simple stuff, i've tried moving the setup out of the dll but I still get the same effect.

It would appear that the dll is getting loaded into other processes, I'm counting the number of DLL_PROCESS_ATTACHs I'm getting and can see its going up (not very scientific i know.

NOTE that this is 32 bit code running on 32bit OS - win2k3.

Are my expectations of the hooking mechanism wrong? should I only be getting the activation of my app or do I need a different type of hook?

EDIT: the trace function writes to a file telling me whats sending me activations

TIA.

1

There are 1 answers

0
push 22 On

Turns out its working ok, as Hans points out, i'm just not seeing the output from the debugger from the other processes, if I put in some extra tracing code - one trace file per attached process - I can see can see that things are working after all.

Many thanks for the replies.