CWnd *pCWnd=CWnd::GetForegroundWindow();   LRESULT CALLBACK GameProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code  VK_HOME
  LPARAM lParam   // 31位为0表示被按下
)
{
if((wParam==VK_HOME)&&((lParam&(1<<31))==0))
{
AfxMessageBox("按下HOME键");
if(newmain==NULL) //newmain是一个CDialogmain的全局指针变量
{
 newmain=new CDialogmain;
 newmain->Create(IDD_DIALOG1,pCWnd);
 newmain->ShowWindow(SW_SHOW);
}
}
else
{   
        //根据当前呼出窗口的状态来显示或隐藏呼出窗口    
            newmain->ShowWindow(newmain->IsWindowVisible() ? SW_HIDE : SW_SHOW);   
        }      //add your code to process anything
return CallNextHookEx(0,code,wParam,lParam);
}
//安装勾子#define gamecaption "MSDN Library - October 2001"
void SetHook()
{
AFX_MODULE_THREAD_STATE* AFXAPI AfxGetModuleThreadState(); HWND hwnd=FindWindow(NULL,gamecaption);
if(hwnd=NULL)
AfxMessageBox("未发现游戏");
DWORD tid=GetWindowThreadProcessId(hwnd,NULL);
//安装线程勾子
::SetWindowsHookEx(WH_KEYBOARD,&GameProc,::GetModuleHandle("gametest.dll"),tid);
}
int CGametestApp::ExitInstance()
{
delete newmain;
newmain=NULL;
return CWinApp::ExitInstance();}
窗口出不来,,伤不起,求指教,,

解决方案 »

  1.   

    调试看
    是否运行到Create, 并且创建成功, 可能是Create失败, 找不到资源IDD_DIALOG1
      

  2.   


    我刚才测试了,果然是创建失败,,但是资源有啊,怎么会找不到呢,if((newmain->Create(IDD_DIALOG_MAIN,pCWnd))==0)
     AfxMessageBox("创建失败");我把资源改了名,又试了,还是不行,
      

  3.   

    我个人猜测,仅供参考,好久没碰;
    此钩子的原理是将其挂载到 另一个应用程序下;
    那么这个钩子运行的进程空间是另一个应用程序的,而另一个进程空间根本就没有资源IDD_DIALOG1了,所以调用失败;调试方法:
    (1)可以尝试着用GetLastError 用文件打印出具体的错误信息 更加精确的查找出问题
    (2)对钩子本身原理的深入了解,比如对钩子所在的进程ID等进行测试,从而也算是进步吧我有空也会一起测试下,嘿嘿
      

  4.   

    HHOOK g_hook=NULL;
    LRESULT CALLBACK GameProc(
      int code,       // hook code
      WPARAM wParam,  // virtual-key code  VK_HOME
      LPARAM lParam   // 31位为0表示被按下
    )
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());    if((wParam==VK_HOME)&&((lParam&(1<<31))==0))
        {
            AfxMessageBox("按下HOME键");
            if(newmain==NULL) //newmain是一个CDialogmain的全局指针变量
            {
             newmain=new CDialogmain;
             newmain->Create(IDD_DIALOG1,pCWnd);
             newmain->ShowWindow(SW_SHOW);
            }
            else
            {
                newmain->ShowWindow(newmain->IsWindowVisible() ? SW_HIDE : SW_SHOW);
            }
        }
        /*else
        {   
            //根据当前呼出窗口的状态来显示或隐藏呼出窗口    
                newmain->ShowWindow(newmain->IsWindowVisible() ? SW_HIDE : SW_SHOW);   
        }*/   //add your code to process anything
        return CallNextHookEx(g_hook,code,wParam,lParam);
    }
    //安装勾子#define gamecaption "MSDN Library - October 2001"
    void SetHook()
    {
        AFX_MODULE_THREAD_STATE* AFXAPI AfxGetModuleThreadState();    HWND hwnd=FindWindow(NULL,gamecaption);
        if(hwnd=NULL)
            AfxMessageBox("未发现游戏");
        DWORD tid=GetWindowThreadProcessId(hwnd,NULL);
        //安装线程勾子
        g_hook=::SetWindowsHookEx(WH_KEYBOARD,&GameProc,::GetModuleHandle("gametest.dll"),tid);
    }
      

  5.   

    HHOOK g_hook=NULL;
    LRESULT CALLBACK GameProc(
      int code,       // hook code
      WPARAM wParam,  // virtual-key code  VK_HOME
      LPARAM lParam   // 31位为0表示被按下
    )
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        if((wParam==VK_HOME)&&((lParam&(1<<31))==0))
        {
            AfxMessageBox("按下HOME键");
            if(newmain==NULL) //newmain是一个CDialogmain的全局指针变量
            {
             newmain=new CDialogmain;
             newmain->Create(IDD_DIALOG1);
             newmain->ShowWindow(SW_SHOW);
            }
            else
            {
                newmain->ShowWindow(newmain->IsWindowVisible() ? SW_HIDE : SW_SHOW);
            }
        }
        /*else
        {   
            //根据当前呼出窗口的状态来显示或隐藏呼出窗口    
                newmain->ShowWindow(newmain->IsWindowVisible() ? SW_HIDE : SW_SHOW);   
        }*/   //add your code to process anything
        return CallNextHookEx(g_hook,code,wParam,lParam);
    }
    //安装勾子#define gamecaption "MSDN Library - October 2001"
    void SetHook()
    {
        AFX_MODULE_THREAD_STATE* AFXAPI AfxGetModuleThreadState();    HWND hwnd=FindWindow(NULL,gamecaption);
        if(hwnd=NULL)
            AfxMessageBox("未发现游戏");
        DWORD tid=GetWindowThreadProcessId(hwnd,NULL);
        //安装线程勾子
        g_hook=::SetWindowsHookEx(WH_KEYBOARD,&GameProc,::GetModuleHandle("gametest.dll"),tid);
    }
      

  6.   


    我刚测试过 对于WH_KEYBOARD的钩子做成dll;
    如果你进程A创建钩子,并将钩子 勾到 进程B(也就是你所说的游戏进程)
    那钩子函数的响应是在你进程B中首先捕获到home按钮,钩子函数的进程空间是在B的进程空间中,而非A的进程空间;那么如果你进程B中没有资源IDD_DIALOG1,自然钩子函数中创建窗口找不到资源了。我的意思表达清楚了,不知道你是否是这种情况呢?
    PS:"网上的代码都这么写的"这种话引用分量不足哈。最好自己去测试,去深入了解。
      

  7.   

    哥,我做过测试了;我关心的是 你看懂了我说的意思没有?
    那么你的"MSDN Library - October 2001"这个窗口应用程序里有没有IDD_DIALOG1这个资源,如果没有那肯定失败;
    你的"MSDN Library - October 2001"这个窗口应用程序里有没有IDD_DIALOG1这个资源?
      

  8.   

    如果你DLL中有这个DIALOG,
    那么DLL创建窗口前加AFX_MANAGE_STATE(AfxGetStaticModuleState())测试下;
      

  9.   

    加上这句话也不行? 你的IDD_DIALOG1资源要在Hook DLL中建立,为此我做了一个满足你要求的例子,而且运行成功。代码如下:/****************************
    *KeyBoardHook.dll的cpp文件
    *****************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include "TestDlg.h"   //要弹出的窗体
    #include <windows.h>#pragma data_seg("shared")
    HINSTANCE g_hIstance = NULL;  //dll句柄
    HHOOK g_InstallHook = NULL;   //Handle to Current Hook
    #pragma  data_seg()#define DLLExport extern "C" __declspec(dllexport)//键盘钩子执行函数
    LRESULT CALLBACK KeyboardProc(  int code,WPARAM wParam,LPARAM lParam)
    {
    FILE *fp;
    if((wParam==VK_HOME)&&((lParam&(1<<31))==0))
    {
    fp = fopen("c:\\keys.txt", "a");
    fprintf(fp, "Hello World!\n");
    fclose(fp);
    CWnd *pCWnd = CWnd::GetForegroundWindow();  //创建弹出窗口
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CTestDlg *tDlg = new CTestDlg;
    tDlg->Create(IDD_DIALOG1, pCWnd);
    tDlg->ShowWindow(SW_SHOW);
    }
    return g_InstallHook ? CallNextHookEx(g_InstallHook,code,wParam,lParam) : 0;
    }//装载钩子
    DLLExport BOOL  InstallHook(HWND hwnd)
    {
    g_hIstance = GetModuleHandle(L"KeyBoardHook.dll");
    g_InstallHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hIstance, GetWindowThreadProcessId(hwnd, 0));
    if (g_InstallHook == NULL)
    return FALSE;
    return TRUE;
    }//卸载钩子
    DLLExport BOOL  UnInstallHook(void)
    {
    return UnhookWindowsHookEx(g_InstallHook);
    }
      

  10.   

    调用钩子代码如下: m_hInstance = NULL;   //Dll句柄
    m_INHook = NULL;      //设置钩子函数入口指针
    m_UIHook = NULL;      //卸载钩子函数入口指针 HWND TestWind = NULL;
    remove("C:\\keys.txt");
    if ((TestWind = ::FindWindowEx(NULL, 0, 0, "TestForHookWin")) == NULL)
    {
    AfxMessageBox("未发现指定窗口");
    }
    else
    {
    m_hInstance = LoadLibrary("KeyBoardHook.dll");
    if (m_hInstance)
    {
    m_INHook = (InstallHook)GetProcAddress(m_hInstance,"InstallHook");
    m_UIHook = (UnInstallHook)GetProcAddress(m_hInstance,"UnInstallHook");
    if (m_INHook != NULL)
    m_INHook(TestWind);
    }
    }
    测试中Hook的窗口名字是"TestForHookWin"。