我在自己的程序中调用外部程序windows图片传真查看器打开文件。但是我想把查看器下面的工具栏屏蔽掉我的程序里启动钩子的代码是
CWnd* pWnd=FindWindow(TEXT("ShImgVw:CPreviewWnd"),NULL);
if(pWnd==NULL) return;
DWORD dwThreadId;
DWORD dwProcessId;
dwThreadId=GetWindowThreadProcessId(pWnd->GetSafeHwnd(),&dwProcessId);
if(m_hook.StartHook(dwThreadId))
{
MessageBox("钩子启动成功!");
}
m_hook.StopHook(); dll里的代码是:
BOOL CPicHook::StartHook(DWORD dwThreadId)
{
BOOL bResult=FALSE;
if(dwThreadId!=0)
{
g_dwThreadId=GetCurrentThreadId();
glhHook=SetWindowsHookEx(WH_MOUSE,PicProc,glhInstance,dwThreadId);
}
    if(glhHook!=NULL)
bResult=TRUE;
return bResult;

}这个回调函数PicProc我应该怎么写阿?还是这个地方是用WH_MOUSE还是用其他的钩子,我是这样认为的:因为这个文件是已经用查看器打开了,钩子才能启动成功。那么这里屏蔽工具栏不可能在其创建的时候取消WM_CREATE,所以我是想用户在点击工具栏的时候拦截鼠标消息。但是我写的picproc拦截了所有的鼠标消息,我试图想把判断一下鼠标消息的类名,但是都不成功,我不知道怎么弄了?垦请高手指点一下!!非常感谢!

解决方案 »

  1.   

    我自己写的回调函数
    LRESULT WINAPI PicProc(int nCode,WPARAM wparam,LPARAM lparam)
    {
    PCWPSTRUCT pcs=NULL;
    pcs=(PCWPSTRUCT)lparam;
    if (pcs&&pcs->hwnd!=NULL)
    {
    TCHAR szClass[256];
    GetClassName(pcs->hwnd,szClass,255);
    if(wparam==WM_COMMAND)
    {   
    AfxMessageBox("获取消息成功!");
    }
    }
     return CallNextHookEx(glhHook,nCode,wparam,lparam);//继续传递消息。
    }
    那个pcs->hwnd里的句柄总是无法获得查看器的句柄,所以得不到ShImgVw:CPreviewWnd这个类名。
    这个钩子设为WM_MOUSE类型的对吗?那个消息类型是WM_COMMAND吗?
      

  2.   

    为什么无法进入到回调函数里进行调试阿?
    我将钩子类型改为了WH_CALLWNDPROC,我知道了只有这个类型的钩子回调函数里的数据结构才能PCWPSTRUCT
    glhHook=SetWindowsHookEx(WH_CALLWNDPROC,PicProc,glhInstance,dwThreadId);
    回调函数我改成了
    LRESULT WINAPI PicProc(int nCode,WPARAM wparam,LPARAM lparam)
    {
    PCWPSTRUCT pt=NULL;
    pt=(PCWPSTRUCT)lparam;
    if(pt&&pt->hwnd!=NULL)
    {
    if(pt->message==WM_COMMAND&&pt->wParam==ID_FILE_SAVE_AS)
    {
    AfxMessageBox("success!");
    }
    }
    return CallNextHookEx(glhHook,nCode,wparam,lparam);//继续传递消息。
    }我不知道PicProc(int nCode,WPARAM wparam,LPARAM lparam)里的wparam和lparam是消息的哪些参数?我不需要句柄,我只需要获得ToolbarWindow32里的一些菜单项,拦截这些菜单项的消息。我这样设对不对啊?有没有人可以告诉我啊???
      

  3.   

    拦截WM_COMMAND消息应该是没有问题的