请问如何让钩子在当前活动窗口中生效? 就是切换到哪个程序的窗口,钩子就监听当前程序.SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);最后一个参数怎么设?实现这样功能的钩子不需要dll文件的吧,线程钩子就可以搞定是么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是否需要DLL取决于你要使用哪种钩子,而且要看这种钩子是否支持全局钩子。当你加载全局钩子后,所有之后运行的进程和窗口才会被你勾上,已运行的窗口无效 ---->jameshooo:我要用的是键盘钩子,我知道全局钩子肯定好用,但是它对所有进程的所有线程都起作用,而且不论是之前的程序还是之后的,只要我按下任意键就会启动钩子,而且,我发现全局钩子速度相当慢,我想仅仅在当前活动窗口(记事本)里面用keybd_event模拟键盘输入数字1,其他程序不受影响.貌似钩子注入到指定程序必须要用到DLL是么?如果是这样的话,请问如何取得活动窗口的线程号呢? 记事本是另一个进程,所以必须用全局钩子。你应该在DllMain的DLL_PROCESS_ATTACH中判断进程主模块是不是notepad.exe,如果是则允许被加载(返回TRUE),不是则不允许被加载(返回FALSE),这样你的钩子只对记事本进程有效 ----> jameshooo: 明白了,可是我对记事本启用全局钩子,截获消息并模拟键盘一直输入数字1,那么其他对记事本的操作不是就失效了么,比如说,我想自己从键盘输入一些其他字符,肯定就不行了.这个问题怎么解决呢?是用return true来丢弃钩子链么,那不就不能一直输入1了么,不太明白,另外是不是需要设置timer解决这个问题呢,给个例子有么.新手,请指教 ----> jameshooo:// ActiveKey.cpp : Defines the initialization routines for the DLL.//#include "stdafx.h"#include <afxdllx.h>#include "ActiveKey.h"#include <winbase.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//Shared data section #pragma data_seg("sharedata") HHOOK glhHook=NULL; //钩子句柄。 HINSTANCE glhInstance=NULL; //DLL实例句柄。 #pragma data_seg()static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };//键盘钩子处理函数。 extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) {for(int i=0;i<10;i++){if(nCode>=0){ //实现代码。 keybd_event(49,1,0,0); keybd_event(49,1,KEYEVENTF_KEYUP,0);//按1 Sleep(300); keybd_event(53,1,0,0); keybd_event(53,1,KEYEVENTF_KEYUP,0);//按5 Sleep(300);}}return CallNextHookEx(glhHook,nCode,wParam,lParam); } CKeyHook::CKeyHook(){} CKeyHook::~CKeyHook() {if( glhHook ) Stop(); } //安装全局钩子。 HHOOK CKeyHook::Start() {glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。 return glhHook; } //卸载全局钩子。 BOOL CKeyHook::Stop() { BOOL bResult = TRUE; if( glhHook ) bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。 return bResult; }extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { //如果使用lpReserved参数则删除下面这行 UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("NOtePadHOOK.DLL Initializing!\n"); //扩展DLL仅初始化一次 if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance)) return 0; new CDynLinkLibrary(ActiveKeyDLL); //把DLL加入动态MFC类库中 glhInstance = hInstance; //插入保存DLL实例句柄 } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("NotePadHOOK.DLL Terminating!\n"); //终止这个链接库前调用它 AfxTermExtensionModule(ActiveKeyDLL); } return 1; }请问这个判断具体如何实现呢? if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("NOtePadHOOK.DLL Initializing!\n"); //扩展DLL仅初始化一次 if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance)) return 0; new CDynLinkLibrary(ActiveKeyDLL); //把DLL加入动态MFC类库中 glhInstance = hInstance; //插入保存DLL实例句柄 TCHAR szPath[MAX_PATH]; GetModuleFileName(NULL, szPath, MAX_PATH); if (szPath中的文件名 不是 "notepad.exe") // 自己改一下,因为szPath中保存的是完整路径 return FALSE;} TCHAR szPath[MAX_PATH]="C:\windows\system32\notepad.exe"; if(GetModuleFileName(NULL, szPath, MAX_PATH)!=MAX_PATH) //自己改一下,因为szPath中保存的是完整路径 return FALSE; 对不对呢?GetModuleFileName返回的是文件名的长度. 用法不对,使用GetModuleFileName之后,你再去比较szPath获得的内容 vc2005怎么使用使用chtmlview在普通对话框显示网页? 紧急求助啊,VC6.0 ODBC的insert的问题 串口通讯的问题 在vc下创建水晶报表后,除了在m_View.Create中可以设定水晶报表的大小,还可以在哪里调整水晶报表的大小? 如何将单文档的背景设置成自己定义的颜色 LPCSTR 对象怎么删除 创建SDI,按菜单FILE后显示一个对话框,还要在上面放控件编程 TextOut与TextOutA和TextOutW U盘的自动退出 DELPHI都有的功能难道VC没有?还是我没有发现? 只有位图数据指针,如何构建位图文件头 关于DDV(第一次用MFC)
当你加载全局钩子后,所有之后运行的进程和窗口才会被你勾上,已运行的窗口无效
明白了,可是我对记事本启用全局钩子,截获消息并模拟键盘一直输入数字1,那么其他对记事本的操作不是就失效了么,比如说,我想自己从键盘输入一些其他字符,肯定就不行了.这个问题怎么解决呢?是用return true来丢弃钩子链么,那不就不能一直输入1了么,不太明白,另外是不是需要设置timer解决这个问题呢,给个例子有么.新手,请指教
//#include "stdafx.h"
#include <afxdllx.h>
#include "ActiveKey.h"
#include <winbase.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif//Shared data section
#pragma data_seg("sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };//键盘钩子处理函数。
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
for(int i=0;i<10;i++)
{
if(nCode>=0)
{ //实现代码。
keybd_event(49,1,0,0);
keybd_event(49,1,KEYEVENTF_KEYUP,0);//按1
Sleep(300);
keybd_event(53,1,0,0);
keybd_event(53,1,KEYEVENTF_KEYUP,0);//按5
Sleep(300);
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
} CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook()
{
if( glhHook )
Stop();
}
//安装全局钩子。
HHOOK CKeyHook::Start()
{
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。
return glhHook;
}
//卸载全局钩子。
BOOL CKeyHook::Stop()
{
BOOL bResult = TRUE;
if( glhHook )
bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。
return bResult;
}extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
//如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NOtePadHOOK.DLL Initializing!\n");
//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))
return 0;
new CDynLinkLibrary(ActiveKeyDLL);
//把DLL加入动态MFC类库中
glhInstance = hInstance;
//插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NotePadHOOK.DLL Terminating!\n");
//终止这个链接库前调用它
AfxTermExtensionModule(ActiveKeyDLL);
}
return 1;
}
请问这个判断具体如何实现呢?
{
TRACE0("NOtePadHOOK.DLL Initializing!\n");
//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))
return 0;
new CDynLinkLibrary(ActiveKeyDLL);
//把DLL加入动态MFC类库中
glhInstance = hInstance;
//插入保存DLL实例句柄 TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL, szPath, MAX_PATH);
if (szPath中的文件名 不是 "notepad.exe") // 自己改一下,因为szPath中保存的是完整路径
return FALSE;
}
if(GetModuleFileName(NULL, szPath, MAX_PATH)!=MAX_PATH) //自己改一下,因为szPath中保存的是完整路径
return FALSE;
对不对呢?
GetModuleFileName返回的是文件名的长度.