请教一个C++(windows编程) 键盘钩子的代码

chichenzhe 2013-12-29 02:08:23
我的代码是参考的这个:
http://hi.baidu.com/tigerwooz/item/13f2e8396d2d71c5392ffa89

由于本身不写C++ 所以用这个只是拿来写个玩具...其实玩具exe的逻辑也很简单. 就是在游戏里如果监听到']'的输入就开始调用VBS 进行循环输入QEQEQEQE这样的按键输入. 然后再按']' 就结束这个VBS.

但是现在碰到了问题. 就是这个WH_KEYBOARD_LL 的方式好像并不能截获所有键盘消息. 比如某些游戏内的消息他无法截获(可能这类游戏做了什么保护) 还有就是windows任务管理器 里的键盘消息他也无法截获. 这是为什么呢? 我查了一下baidu, WH_KEYBOARD_LL 好像还比较底层.这么底层为什么还截获不到呢?

上面链接给的代码有点小问题.我修改后满足我需求的代码如下:
注: 因为调用的目标vbs是一个循环loop所以又查了百度.. 用了个thread..... 但是目测我这么写肯定没问题.

/*
kbhook.cpp
*/
#define _WIN32_WINNT 0400
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define WH_KEYBOARD_LL 13
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//#include <iostream.h>

DWORD g_main_tid = 0;
HHOOK g_kb_hook = 0;
int _sign = 0;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data

BOOL CALLBACK con_handler (DWORD)
{
PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
return TRUE;
};

LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
{
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
DWORD vkCode = p->vkCode;
//const char *info = NULL;
if (w == WM_KEYDOWN)
{
printf("key down...\n");
}
else if (w == WM_KEYUP)
{
if(vkCode == 221)
{
printf("...key up [%d]\n", vkCode);
if(_sign == 0)
{
_sign = 1;
printf("we need open you.\n");
HANDLE hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
}
else
{
_sign = 0;
printf("we need stop you.\n");
system("taskkill /im wscript.exe /f");
}
}
}

/*
printf ("%s - vkCode [%04x], scanCode [%04x]\n",info, p->vkCode, p->scanCode);
*/
// always call next hook
return CallNextHookEx (g_kb_hook, code, w, l);
};

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
printf("the thread is start.\n");
system("todoscan.vbs");
printf("the thread is end.\n");
};

int main (void)
{
g_main_tid = GetCurrentThreadId ();
SetConsoleCtrlHandler (&con_handler, TRUE);
printf ("1\n");
g_kb_hook = SetWindowsHookEx (WH_KEYBOARD_LL, &kb_proc, GetModuleHandle(NULL), 0);// 不能为NULL,否则失败
printf ("2\n");
if (g_kb_hook == NULL)
{
fprintf (stderr, "SetWindowsHookEx failed with error %d\n", ::GetLastError ());
return 0;
};
printf ("3\n");
// 消息循环是必须的.
MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
};
printf ("4\n");
UnhookWindowsHookEx (g_kb_hook);
printf ("5\n");
return 0;
};
...全文
120 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
chichenzhe 2013-12-30
  • 打赏
  • 举报
回复
自己解决 了... 不是代码问题. 是win7/8 需要用管理员身份运行...
chichenzhe 2013-12-29
  • 打赏
  • 举报
回复
对了, 我嫌VS什么的那些东西体积太大. 所以直接用的mingw用命令行编译的. 由于用的win8 当时还缺一些dll 所以手动又下了点dll (libgcc_s_dw2-1.dll, libstdc++-6.dll) 直接丢进玩具.exe的文件夹下

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧