其实我是在钩子的回调函数中发消息的,却出错,我新手一个,不知道怎么办了!代码如下:#pragma data_seg("MyData")
 CString key;
 CWnd *pWindow=new CWnd;
 HHOOK hHook;
 HINSTANCE gInstance=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:MyData,RWS")#define WM_HOOKKEY WM_USER+1extern "C" _declspec(dllexport) LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
switch(wParam){
case '1':
key='1';
            pWindow->SendMessage(WM_HOOKKEY,(WPARAM)&key,NULL);//这里有问题!!删了这行一切正常...
return 1;
break;
        default: 
key='x';return CallNextHookEx(NULL,nCode,wParam,lParam);
break;
}}
extern "C" _declspec(dllexport) void HookOn()
{
hHook=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,gInstance,0);
}
extern "C" _declspec(dllexport) void SetWingdow(CWnd *hWindow)
{
pWindow=hWindow;
}在工程中这样调用:
void CHookMainDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HookOn();
}void CHookMainDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
HookOff();
}void CHookMainDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CWnd *w=AfxGetMainWnd();  
SetWingdow(w); //把主窗体传给DLL
}如果不发送消息,钩子一切正常,一发送就异常...而且即使我在主窗体中不对自定义消息做任何处理,也出错,所以我觉得一定是发送时出了问题...
请大家帮忙!

解决方案 »

  1.   

    CWnd *w=AfxGetMainWnd();  
    SetWingdow(w); //把主窗体传给DLL
    这种将当前窗口指针传递给动态库是有问题的。
    具体原因我也说不上来,你最好是传递窗体的句柄,而不要传递指针。发送消息也用句柄。
      

  2.   

    直接传handle吧,再说了,传指针也不用再NEW吧!
      

  3.   

    其实,我原先用 AfxGetMainWnd()->GetSafeWnd,可怎么也转不成HWND型,提示 HWND const无法转成 HWND...那么,应该如何传递窗体的 handle 呢?
      

  4.   

    直接传递AfxGetMainWnd()->m_hWnd就行了。
      

  5.   

    pWindow指针只是分配了空间,并没有赋值,调用它肯定会出错.
    应该在SetWindowsHook就把调用窗口指针传进来,而且pWindow应该是窗口句柄Hwnd类型,而不应该是CWnd*.可以使用FindWindow.AfxGetMainWnd取到的是当前加载该dll的主窗口句柄,而不是调用者的窗口句柄.
      

  6.   

    明白了....传递窗体句柄 AfxGetMainWnd()->m_hWnd 就可以了...
    原来却死活无法转换 AfxGetMainWnd()->GetSafeWnd 到 HWND....