我是按照全局钩子例子来做的,我想在“天使之恋”里面按键跳出我的对话框,本来是很简单的,不知道怎么回事,在游戏里面按键后我的对话框在游戏里面闪烁一下就不见了,我建立的是非模式对话框。消息处理函数如下
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{ //按F12弹起时呼出外挂BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION) {
if (pCWndWGMain == NULL) 
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
CWnd *pCWnd = CWnd::GetForegroundWindow();
char buf[MAX_PATH];
::GetClassName(pCWnd->GetSafeHwnd(), buf, MAX_PATH);
if (lstrcmpi(buf, "_MIDAGEONL_") == 0) {
pCWndWGMain = new CTest();
pCWndWGMain->Create(IDD_DIALOG1, pCWnd);
pCWndWGMain->ShowWindow(SW_SHOW);}
}
}
return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);}
不知道哪里出错。请高手指正。QQ:44456964。解决后100分我可全送

解决方案 »

  1.   

    SetWindowPos(&pCWndWGMain->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
      

  2.   

    我加上了SetWindowPos(pCWndWGMain->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
    可是依然没用,进入游戏后还是一闪就没了,需求解决方法。急!!
      

  3.   

    你的窗口需要有自己的窗口过程,目前你使用了游戏中的线程,而线程处理函数中不会有对你的窗口消息的处理.你要自己创建一个线程,在这个线程中创建窗口并循环接收窗口消息,象一个win32程序一样.
      

  4.   

    晕,代码没问题,游戏改成窗口化模式运行, 
    看来你对DX没什么了解,Dx是卷轴方式更新的,游戏的根新时针和你的对话框刷新不同步,就会把对话框刷掉的,把游戏改成窗口模式,不带窗口模式,找游戏配置文件自己改。如果实在不行,写代码先把游戏窗口化,很简单就不用说了把。如果还是实在不行,就:hWndDlg = CreateDialog(g_hInstance,
            MAKEINTRESOURCE(IDD_DIALOG_SAMPLE),
            hWnd, (DLGPROC) SampleDlgProc);
    ShowWindow(hWndDlg, SW_SHOWNORMAL);当然这只是在默认是GDI的时候才可以,有时候就不行,比如现在。如果硬件支持DDCAPS2_CANRENDERWINDOWED,那么就比较好说。应用程序首先调用IDirectDraw7::FlipToGDISurface ,让GDI接口获得控制权。。(此处省略250字)下面这个代码,来自FSWindow_Init函数,创建clipper,关联应用程序窗口,并且把GDI升权:if (ddObject->CreateClipper(0, &ddClipper, NULL) == DD_OK)
        ddClipper->SetHWnd(0, hwndAppWindow);
    ddObject->FlipToGDISurface();然后下面这段参考自FSWindow_Update的代码负责维护:ddFrontBuffer->SetClipper(ddClipper);
    ddFrontBuffer->Blt(NULL, ddBackBuffer, NULL, DDBLT_WAIT, NULL);由于GDI获得权限,因此这种情况下鼠标显示很正常。如果硬件不支持DDCAPS2_CANRENDERWINDOWED ,那么应用程序需要先接受GDI画好的图片,然后(省略200字)FSWindow提供2种方法,这2种方法分别适用于静态content和动态content。静态content比较快,因为内存设备环境比窗口设备环境快。当然局限就是只能画不变化的对话框,比如一些提示了,请记住采用这种方法必须自己改变图片,如果打算有一些好看的操作。(估计你要的就是这种。。)对于静态的,在初始化窗口的时候,FSWindow 调用CreateBMPFromWindow ,该函数创建位图句柄并在窗口上显示,保存位图句柄的hwndFSWindowBMP是全局变量。如下:if (FSWindow_IsStatic)
    {
        hdcMemory = CreateCompatibleDC(NULL);
        SelectObject(hdcMemory, hwndFSWindowBMP);
        BitBlt(hdcBackBuffer, x, y, cx, cy, hdcMemory, 0, 0, SRCCOPY);
        DeleteDC(hdcMemory);
    }
    对于动态的,用下面的函数:
    BitBlt(hdcBackBuffer, x, y, cx, cy, hdcScreen, x, y, SRCCOPY);
    该函数的参数来自GetWindowRect()如果硬件不支持DDCAPS2_CANRENDERWINDOWED 的时候,画鼠标需要自己画:displaying it on the back buffer just before