Solved

subclassing procedure

Posted on 1997-04-21
1
331 Views
Last Modified: 2013-12-04
Hello.

After reading a bit about hooks (Richter, etc.), I am trying to implement
a program that will subclass the procedure belonging to a dialog of another
application (on a Win95 or NT system).

Unfortunately, I cannot make it work.
Can you please help me find what's wrong?

What I'm trying to do is:

In my EXE file (console app):
------------------------------
1) Start the target application using CreateProcess()

2) Load a DLL with the hook using LoadLibrary() and
   get  the hooking procedure address using GetProcAddress().

3) Call the hooking procedure with the target app's thread ID as a parameter.

4) Wait for the target app to exit (using WaitForSingleObject())

5) Remove the hook, free the DLL, cleanup and exit.

No message loop or anything fancy...


In my DLL:
------------
1) In the DllMain() - Save the DLL hInstance.

2) In the hooking proc - call:
   hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hinstDll, dwThreadId);
   passing the saved DLL hInstance and the target app's thread ID
   (from the EXE step #3).

   [problem #1]

3) In the Hook - do something like:

   if (code == HC_ACTION && wParam == PM_REMOVE &&
       ((MSG*)lParam)->message == WM_INITDIALOG &&
       MyCompareDialog(((MSG*)lParam)->hwnd))
   {
       oldDlgProc = SubclassDialog(((MSG*)lParam)->hwnd, MyDlgProc);
   }
   return CallNextHookEx(hHook, code, wParam, lParam);

   [problem #2]

4) In MyCompareDialog() - get the dialog's title using GetWindowText()
   and compare it to the title of the dialog I wish to subclass.

5) In MyDlgProc() - do something like:

   switch (message)
   {
       case WM_COMMAND:
           switch GET_WM_COMMAND_ID(wParam, lParam)
           {
               case 57670: // A button identifier, found with Spy++
                   MessageBox(NULL, "Gotcha!", "Info", MB_ICONINFORMATION);
                   return TRUE; // Message was processed
           }
   }
   // Call previous dialog procedure
   return CallWindowProc((WNDPROC)oldDlgProc, hWnd, message, wParam, lParam);

Now the problems:

Problem #1:
        The call to SetWindowsHookEx() sometimes fails with error 87
        (invalid parameter), but if I put a breakpoint on the line and
        then continue, it seems to work OK.  Huh?

Problem #2:
        The hook does not seem to catch WM_INITDIALOG.
        In fact, the first message it gets is WM_MOUSEMOVE (0x200).

0
Comment
Question by:zvior
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
1 Comment
 
LVL 2

Accepted Solution

by:
sapek earned 160 total points
ID: 1334708
1. Make sure you set DllMain() the entry point for your dll. Otherwise your DllMain() would never be excuted and you wouldn't have rigth hInstance.2. Try using CBT hook instead. This what Microsoft originaly did in ctl3d.dll that subclassed dialog controls to give them 3d look.Adam
0

Featured Post

Want Experts Exchange at your fingertips?

With Experts Exchange’s latest app release, you can now experience our most recent features, updates, and the same community interface while on-the-go. Download our latest app release at the Android or Apple stores today!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you have ever found yourself doing a repetitive action with the mouse and keyboard, and if you have even a little programming experience, there is a good chance that you can use a text editor to whip together a sort of macro to automate the proce…
In this article, I will show how to use the Ribbon IDs Tool Window to assign the built-in Office icons to a ribbon button.  This tool will help us to find the OfficeImageId that corresponds to our desired built-in Office icon. The tool is part of…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Monitoring a network: how to monitor network services and why? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the philosophy behind service monitoring and why a handshake validation is critical in network monitoring. Software utilized …

617 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question