+ -
当前位置:首页 → 问答吧 → 如何获取系统时钟的 WM_LBUTTONDOWN消息

如何获取系统时钟的 WM_LBUTTONDOWN消息

时间:2011-12-17

来源:互联网

我将下文这个DLL通过SetWindowsHookEx (WH_GETMESSAGE, HookProc, gDllInstance, clockThreadId);

注册到了任务栏时钟上,但是始终获得不到红色字体的那个鼠标左键点击消息,求教。

C/C++ code

// dll.cpp : 定义 DLL 应用程序的入口点。
//

#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

//常量声明:
bool gRegisteredSubClass = false;//是否已经注册了子窗口过程
HINSTANCE gDllInstance;//当前DLL的实例
static HHOOK gHook = 0;//HOOK
//函数声明:
HWND GetClockWindow ();
static LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK ClockProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call){ 
        case DLL_PROCESS_ATTACH:
            gDllInstance = hModule;
            DisableThreadLibraryCalls (gDllInstance);
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

extern "C" _declspec(dllexport) BOOL registerTrayClockSubClass(){
    //获得时钟所在的线程
    DWORD explorerProcessId;
    DWORD clockThreadId = GetWindowThreadProcessId (GetClockWindow (),
        &explorerProcessId);
    if (!explorerProcessId){
        return false;
    }
    //将dll注册到线程中去
    SetWindowsHookEx (WH_GETMESSAGE, HookProc, gDllInstance, clockThreadId);
    return true;
}


//获得到TrayClock的Hwnd
 
HWND
GetClockWindow ()
{
    HWND hShellTrayWnd =  FindWindow (_T ("Shell_TrayWnd"), 0);
    HWND hTrayNotifyWnd = FindWindowEx (hShellTrayWnd, 0, _T ("TrayNotifyWnd"), 0);
    HWND hTrayClockWClass = FindWindowEx (hTrayNotifyWnd, 0,_T ("TrayClockWClass"), 0);
    return hTrayClockWClass;
}


//HOOK的回调函数
static LRESULT CALLBACK
HookProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    //如果没有注册SubClass,就注册
    if (!gRegisteredSubClass)
    {
        //::SetWindowSubclass(GetClockWindow (), ClockProc, 0, 0);
        ::SetWindowLong(GetClockWindow (), GWL_WNDPROC, (LONG)ClockProc);
        gRegisteredSubClass = true;
         
    }
    return CallNextHookEx(gHook, nCode, wParam, lParam);
}

//时钟的回调函数
static LRESULT CALLBACK
ClockProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    LRESULT ret_val = 0;
    [b]if(WM_LBUTTONDOWN==msg) [/b]
    ::MessageBox(NULL,NULL,NULL,MB_OK);
     

    return ret_val;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif


作者: yu1ei   发布时间: 2011-12-17

代码段内好像不能显示红色字体,就是 if(WM_LBUTTONDOWN==msg)这一行。

作者: yu1ei   发布时间: 2011-12-17

挂钩成功了吗?

作者: wltg2001   发布时间: 2011-12-17