其实我是在钩子的回调函数中发消息的,却出错,我新手一个,不知道怎么办了!代码如下:#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
}如果不发送消息,钩子一切正常,一发送就异常...而且即使我在主窗体中不对自定义消息做任何处理,也出错,所以我觉得一定是发送时出了问题...
请大家帮忙!
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
}如果不发送消息,钩子一切正常,一发送就异常...而且即使我在主窗体中不对自定义消息做任何处理,也出错,所以我觉得一定是发送时出了问题...
请大家帮忙!
SetWingdow(w); //把主窗体传给DLL
这种将当前窗口指针传递给动态库是有问题的。
具体原因我也说不上来,你最好是传递窗体的句柄,而不要传递指针。发送消息也用句柄。
应该在SetWindowsHook就把调用窗口指针传进来,而且pWindow应该是窗口句柄Hwnd类型,而不应该是CWnd*.可以使用FindWindow.AfxGetMainWnd取到的是当前加载该dll的主窗口句柄,而不是调用者的窗口句柄.
原来却死活无法转换 AfxGetMainWnd()->GetSafeWnd 到 HWND....