在HOOK.DLL中的钩子消息处理函数中创建一个无模式对话框pDlg->Create(IDD_DIALOG),可以通过编译连接,而运行后提示“试图执行系统不支持的操作”,将创建对话框换成MESSAGEBOX()则能正常运行。对一个线程设置一次挂钩只一次有效吗?比如对键盘(WH_KEYBOARD)设置钩子,第二次按键就不能被处理了。
解决方案 »
- 如何能够得到指向CFrameView子类的指针?
- 辞职日记----记录31岁的程序员跳槽心态(续)
- 如何使窗口始终处于前台?
- 急问:如何用代码访问网络上共享文件夹的共享文件。
- 关于从文件中搜索指定字符串
- 一个带指针的结构怎么初始化和释放?
- 请帮助:那儿有像Windows XP窗口那样的类库,急
- 问一画图的问题。
- 在线求助:一个简单的数据库问题,请大家帮忙!
- in which place i can find the most beautiful reference answer about mfc (in chinese)?
- 请大家帮忙看一下我用writefile咋不能写入东西呢?
- 怎么调用一个程序来打开一个文件啊?
2.可以勾多次,把你的键盘钩子函数代码贴出来
代码如下:
// cq.cpp : Defines the initialization routines for the DLL.
//#include "stdafx.h"
#include <afxdllx.h>
#include "PopupDlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif//global variable
HINSTANCE g_hinstDll = NULL;
static HHOOK g_hhkMain = NULL;
CPopupDlg *pDlgPopup;//global function
LRESULT WINAPI KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
void StartHook();
void EndHook();static AFX_EXTENSION_MODULE CqDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("CQ.DLL Initializing!\n");
g_hinstDll = hInstance;
pDlgPopup = new CPopupDlg; // Extension DLL one-time initialization
if (!AfxInitExtensionModule(CqDLL, hInstance))
return 0; new CDynLinkLibrary(CqDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
if(pDlgPopup != NULL)
pDlgPopup->SendMessage(WM_CLOSE, 0, 0);
delete pDlgPopup; TRACE0("CQ.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(CqDLL);
}
return 1; // ok
}void StartHook()
{
g_hhkMain = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc,
g_hinstDll, NULL);}void EndHook()
{
if (g_hhkMain != NULL)
{
::UnhookWindowsHookEx(g_hhkMain);
g_hhkMain = NULL;
}
}
//Hook PROC
LRESULT WINAPI KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
static BOOL fFirstTime = true;
HWND hWnd; if (fFirstTime)
{
//The DLL just got injected
fFirstTime = false; //对F12进行处理
switch (wParam)
{case VK_F12: //CreateDialog
hWnd = ::GetForegroundWindow(); //取得当前窗口句柄
pDlgPopup->SetParentWndHandle(hWnd);
if(pDlgPopup != NULL)
{
pDlgPopup->Create(IDD_POPUP_DIALOG,
CWnd::FromHandle(hWnd));
pDlgPopup->ShowWindow(SW_SHOW);
pDlgPopup->UpdateWindow();
}
else
{
MessageBox(NULL, "OK!", "OK", MB_OK);
} } } return(CallNextHookEx(g_hhkMain, nCode, wParam, lParam));}
肯定执行非法的操作了,比如没有初始化的内存等。
贴出代码看看。
而是你的这个IDD_DIALOG对话框的代码中
我用一个新建的对话框资源(没加任何代码),也有同样的问题