CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    Nov 2011
    Posts
    3

    Window hook is not working in windows 7 but in windows xp

    We are migrating our applications from windows xp to windows 7. One of the application is window and mouse hook. same code is working fine in windows xp but it is not working in windows 7 target machine(windows 7 installed with our own software platform).

    *One important thing is its working fine in my personal laptop which is having windows 7 os*

    i dont know what is happening...

    i have pasted the code(only window hook) of dll file which is having hook function to be called.

    void ProcWMMoving (HWND hWnd , LPRECT pRect)

    {

    RECT rcWnd;

    int Width = 0;

    ::GetWindowRect(hWnd, &rcWnd);

    Width = rcWnd.right - rcWnd.left;
    if( pRect->left <= 200 )
    {
    pRect->left = 200 + 1;
    pRect->right = 200 + Width + 1;
    }
    if( pRect->right >= 800)
    {
    pRect->right = 800 - 1;
    pRect->left = (800 - Width) - 1;

    }
    }

    LRESULT CALLBACK ScreenPosWndProc(HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)

    {


    BOOL bResult = TRUE;

    const WNDPROC wpOldProc = (WNDPROC) ::GetProp(hWnd, WND_PROC_PROP);

    if (wpOldProc == NULL)
    {
    DebugMsg(_T("ScreenPosWndProc(): ERROR - wpOldProc is NULL!!!"));
    bResult = FALSE;
    }
    DebugMsg(_T("entering into ScreenPosWndProc"));
    LRESULT lResult = 0;

    if (bResult)
    {
    TCHAR strClassName[WINDOW_POS_CLASS_NAME_MAX_LEN];

    switch (uMsg)
    {
    case WM_MOVING:
    DebugMsg(_T("processing Wnd moving msg!"));
    ProcWMMoving (hWnd,
    (LPRECT) lParam);
    break;
    case WM_CREATE:
    GetClassName (hWnd, strClassName, WINDOW_POS_CLASS_NAME_MAX_LEN - 1);
    if (_tcscmp ( strClassName, WINDOW_POS_SYS_TREE_VIEW_32_CLASS_NAME) == 0)
    {
    DebugMsg (_T("WM_CREATE: Class Matched = %s, hwnd=0x%x"),
    strClassName, hWnd);

    g_hSysTreeView32ParentWnd = GetParent (hWnd);
    if (g_hSysTreeView32ParentWnd != NULL)
    {
    g_hSysTreeView32ParentWnd = GetParent (g_hSysTreeView32ParentWnd);
    if (g_hSysTreeView32ParentWnd != NULL)
    {
    // Init. needed to detect repositioning of Help window with Tree View
    g_nRequestToRepSysTreeView32Parent = TRUE;
    }
    }
    }
    else if (_tcscmp ( strClassName, WINDOW_POS_MS_WINHELP_CLASS_NAME) == 0)
    {
    DebugMsg (_T("WM_CREATE: Class Matched = %s, hwnd=0x%x"),
    strClassName, hWnd);

    g_hWinHelpWnd = hWnd;

    // Init. needed to detect repositioning of Help window with MS_WINHELP class
    g_nRequestToRepMsWinHelpWindow = TRUE;
    }

    break;

    case WM_DESTROY:
    if (g_nRequestToRepSysTreeView32Parent)
    {
    GetClassName (hWnd, strClassName, WINDOW_POS_CLASS_NAME_MAX_LEN - 1);
    if (_tcscmp ( strClassName, WINDOW_POS_SYS_TREE_VIEW_32_CLASS_NAME) == 0)
    {
    DebugMsg (_T("WM_DESTROY: Class Matched = %s, hwnd=0x%x"),
    strClassName, hWnd);

    // Init. needed to detect repositioning of Help window with Tree View
    g_nRequestToRepSysTreeView32Parent = FALSE;
    }
    }
    else if (g_nRequestToRepMsWinHelpWindow)
    {
    GetClassName (hWnd, strClassName, WINDOW_POS_CLASS_NAME_MAX_LEN - 1);
    if (_tcscmp ( strClassName, WINDOW_POS_MS_WINHELP_CLASS_NAME) == 0)
    {
    DebugMsg (_T("WM_DESTROY: Class Matched = %s, hwnd=0x%x"),
    strClassName, hWnd);

    // Init. needed to detect repositioning of Help window with Tree View
    g_nRequestToRepMsWinHelpWindow = FALSE;
    }
    }

    break;

    case WM_NCDESTROY:

    // Restore the original window procedure.
    ::RemoveProp(hWnd, WND_PROC_PROP);
    ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG) wpOldProc);

    m_mapHwnd2WndProc.erase(hWnd);

    DebugMsg(_T("WM_DESTROY: restored WNDPROC @ 0x%08x for 0x%08x"),
    wpOldProc, hWnd);
    break;

    default:
    break;
    }

    lResult = ::CallWindowProc(wpOldProc, hWnd, uMsg, wParam, lParam);
    }
    else
    {
    lResult = :efWindowProc(hWnd, uMsg, wParam, lParam);
    }

    //////
    // Call the window procedure.
    //////

    return lResult;
    }




    static LRESULT CALLBACK Monitor(int nCode, WPARAM wParam, LPARAM lParam)
    {

    DebugMsg(_T("entering into monitor()!"));
    switch(nCode)
    {
    case HCBT_CREATEWND:
    {
    DebugMsg(_T("create"));
    const HWND hWnd = (HWND) wParam;
    const WNDPROC wpOrigProc = (WNDPROC)::SetWindowLong(hWnd,GWL_WNDPROC,(LONG) ScreenPosWndProc);
    ::SetProp(hWnd, WND_PROC_PROP, wpOrigProc);
    m_mapHwnd2WndProc[hWnd] = wpOrigProc;
    }
    break;
    }
    return CallNextHookEx(g_hhkCallWndProc, nCode, wParam, lParam);
    }



    __declspec(dllexport) BOOL setMyHook(HINSTANCE hInst)
    {
    g_hhkCallWndProc = SetWindowsHookEx(WH_CBT,Monitor,hInst,0);
    return TRUE;
    } // setMyHook

    __declspec(dllexport) void clearMyHook()
    {
    UnhookWindowsHookEx(g_hhkCallWndProc);

    } // clearMyHook


    **i am calling setMyHook and clearMyHook from client exe with the following code**



    typedef BOOL(CALLBACK* SETHOOKPROC)(HINSTANCE hinst);
    typedef void(CALLBACK* UNSETHOOKPROC)();



    int APIENTRY _tWinMain(HINSTANCE /*hInstance*/,
    HINSTANCE /*hPrevInstance*/,
    LPTSTR /*lpCmdLine*/,
    int /*nCmdShow*/)
    {
    HINSTANCE hinstDLL = 0;

    //HOOKPROC fpMouseProc = 0 ;
    UNSETHOOKPROC fpCBTProc = 0 ;

    SETHOOKPROC fpSetCBTHook = 0;

    hinstDLL = LoadLibrary(_T("HookAppWin.dll"));

    ASSERT(hinstDLL);

    const int i =0;
    bool bSucess = false;
    switch(i)
    {
    case 0:
    {

    fpSetCBTHook = (SETHOOKPROC)GetProcAddress (hinstDLL, "setMyHook");

    ASSERT( fpSetCBTHook );
    bSucess = fpSetCBTHook(hinstDLL);
    }
    break;
    }
    if( bSucess )
    {
    // Create the auto-reset event that is signalled to indicate shutdown of Mousetrap process
    HANDLE lMouseTrapStopHandle = CreateEvent(NULL, FALSE, FALSE, MOUSE_TRAP_STOP_EVENT_NAME);

    if (lMouseTrapStopHandle)
    {
    // Wait for a process to request shutdown of this process
    ::WaitForSingleObject (lMouseTrapStopHandle, INFINITE);

    ::CloseHandle (lMouseTrapStopHandle);
    }
    }

    fpCBTProc = (UNSETHOOKPROC)GetProcAddress(hinstDLL, "clearMyHook");
    ASSERT(fpCBTProc);

    fpCBTProc();

    if (NULL != hinstDLL)
    FreeLibrary (hinstDLL);

    return 0;
    }

    please help me to resolve this...

  2. #2
    Join Date
    Mar 2012
    Posts
    2

    Re: Window hook is not working in windows 7 but in windows xp

    Windows 7 has increased security feature , you have to try running your app as admin on your system i think after this you will get out from this problem.
    If not solve after this than you can go for Technical Support.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured