在HOOK.DLL中的钩子消息处理函数中创建一个无模式对话框pDlg->Create(IDD_DIALOG),可以通过编译连接,而运行后提示“试图执行系统不支持的操作”,将创建对话框换成MESSAGEBOX()则能正常运行。对一个线程设置一次挂钩只一次有效吗?比如对键盘(WH_KEYBOARD)设置钩子,第二次按键就不能被处理了。

解决方案 »

  1.   

    1.dll中显示一个对话框,用::DialogBox
    2.可以勾多次,把你的键盘钩子函数代码贴出来
      

  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));}
      

  3.   

    TO:demetry(大松),怎么修改才能钩多次啊?
      

  4.   

    你这个程序当然不能钩多次。你的fFirstTime变量第一次为TRUE,在进入if后,你的fFirstTime = false;语句将它变为FALSE。但是由于你的fFirstTime被你定义为static,所以以后再HOOK时,if语句内的程序将不会被执行。建议你把if语句放到case VK_F12:中
      

  5.   

    建议在pDlg->Create(IDD_DIALOG)后调用::GetLastError看一看错误原因
      

  6.   

    你的这个DIALOG初始化代码inistance中都干了些什么?
    肯定执行非法的操作了,比如没有初始化的内存等。
    贴出代码看看。
      

  7.   

    错误不是出现在pDlg->Create(IDD_DIALOG)这一行。
    而是你的这个IDD_DIALOG对话框的代码中
      

  8.   

    to coyer(网中一虫)
    我用一个新建的对话框资源(没加任何代码),也有同样的问题