Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2057
  • Last Modified:

Problem with SetWindowsHookEx to another application's window

hello.

I'm trying to hook the messages of a window from external application.
I have an exe file which use FindWindow to get the external application's window handle, and in my hook dll, i use GetWindowThreadProcessId, to get the thread id, and then use SetWindowsHookExlike this:
temp1 = GetWindowThreadProcessId(hHookedWindow, &temp2);
hHookGETMESSAGE      = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hdll,temp1);

Using the debugger i see that hHookGETMESSAGE isn't NULL, which means the hook succeded, but the problem is that i don't reach the hook procedure which is in my dll.

The hook dll looks like this:

#include <windows.h>
#include <stdio.h>

#pragma data_seg(".shared")
HHOOK hHookGETMESSAGE=NULL;
HINSTANCE      hdll;
#pragma data_seg()
#pragma comment(linker,"/SECTION:.shared,RWS")

extern "C" bool FAR PASCAL SetTheHook(HWND phHookedWindow);
extern "C" bool FAR PASCAL RemoveTheHook(void);

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
      MSG            *msg;

      FILE      *pr;
      pr = fopen("c:\\hook.log", "a");
      fprintf(pr, "MSG: %d %d %d\n", nCode, wParam, lParam);
      fclose(pr);

      if (nCode < 0) {
            return CallNextHookEx(hHookGETMESSAGE, nCode, wParam, lParam);
      }

      msg = (MSG FAR *)lParam;

      if (msg->hwnd == hHookedWindow) {
      }

      return CallNextHookEx(hHookGETMESSAGE, nCode, wParam, lParam);
}

int APIENTRY DllMain (HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)
{
      BOOL Ret;
      WNDCLASSEX      wcex;

      hdll = hInstance;

      switch ( dwReason ) {
        case DLL_THREAD_ATTACH :
            return (TRUE);
        case DLL_PROCESS_ATTACH:
            Ret = DisableThreadLibraryCalls((HMODULE)hInstance);
            return (Ret);
        case DLL_THREAD_DETACH :                                             
              return( TRUE );      
        case DLL_PROCESS_DETACH:
              return( TRUE );      
      }
      return( FALSE );
}

extern "C" bool FAR PASCAL SetTheHook(HWND phHookedWindow)
{
      RECT      Rect;
      HWND      hButton2;
      DWORD      temp1;
      
      hHookedWindow = phHookedWindow;

      temp1 = GetWindowThreadProcessId(hHookedWindow, &temp2);

       hHookGETMESSAGE      = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hdll,temp1);
      return true;
}

extern "C" bool FAR PASCAL RemoveTheHook(void)
{
   UnhookWindowsHookEx(hHookGETMESSAGE);
   return true;
}

Ofcause the logfile is empty which indicates i didn't enter the function.

So, can someone think of the reason ?
Maybe it concert to the DEF file ?

Thanks.
0
vagy
Asked:
vagy
  • 2
  • 2
1 Solution
 
jkrCommented:
In order to set a hook in anexternal application, the thread ID must be set to zero, e.g.

hHookGETMESSAGE = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hdll,0);

See also

http://msdn.microsoft.com/library/techart/msdn_hooks32.htm
0
 
vagyAuthor Commented:
When i use 0, i get the message
"Initialization of the dynamic link library XXXX.dll failed. The process is terminating abnormaly".
I get this message infinitly, when XXXX are some process that run on my computer. I must terminate the application to avoid the endless message. If i use Keyboard hook for example instead of the GETMESSAGE, is doesn't happen. It also happen in WH_CALLWNDPROC.
Any idea ?
0
 
jkrCommented:
This message is due to the last statement in your 'DllMain()':

return( FALSE );

A 'DllMain()' should *ONLY* return 'FALSE' if a *really* *severe* condition is met, not just 'by default'...
0
 
vagyAuthor Commented:
Well, the problem is solved. It indeed was because of return FALSE, but it wasn't in this line, it's because a RegisterClassEx i had in the DLL_PROCESS_ATTACH that i erased from the source i gave. And since the
Registerclass failed it return 0 and caused the error.
So thank you for showing the direction.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now