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();}
窗口出不来,,伤不起,求指教,,
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();}
窗口出不来,,伤不起,求指教,,
是否运行到Create, 并且创建成功, 可能是Create失败, 找不到资源IDD_DIALOG1
我刚才测试了,果然是创建失败,,但是资源有啊,怎么会找不到呢,if((newmain->Create(IDD_DIALOG_MAIN,pCWnd))==0)
AfxMessageBox("创建失败");我把资源改了名,又试了,还是不行,
此钩子的原理是将其挂载到 另一个应用程序下;
那么这个钩子运行的进程空间是另一个应用程序的,而另一个进程空间根本就没有资源IDD_DIALOG1了,所以调用失败;调试方法:
(1)可以尝试着用GetLastError 用文件打印出具体的错误信息 更加精确的查找出问题
(2)对钩子本身原理的深入了解,比如对钩子所在的进程ID等进行测试,从而也算是进步吧我有空也会一起测试下,嘿嘿
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);
}
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);
}
我刚测试过 对于WH_KEYBOARD的钩子做成dll;
如果你进程A创建钩子,并将钩子 勾到 进程B(也就是你所说的游戏进程)
那钩子函数的响应是在你进程B中首先捕获到home按钮,钩子函数的进程空间是在B的进程空间中,而非A的进程空间;那么如果你进程B中没有资源IDD_DIALOG1,自然钩子函数中创建窗口找不到资源了。我的意思表达清楚了,不知道你是否是这种情况呢?
PS:"网上的代码都这么写的"这种话引用分量不足哈。最好自己去测试,去深入了解。
那么你的"MSDN Library - October 2001"这个窗口应用程序里有没有IDD_DIALOG1这个资源,如果没有那肯定失败;
你的"MSDN Library - October 2001"这个窗口应用程序里有没有IDD_DIALOG1这个资源?
那么DLL创建窗口前加AFX_MANAGE_STATE(AfxGetStaticModuleState())测试下;
*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);
}
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"。