用键盘全局钩子Hook监视多进程键盘操作

闲来无事,在WIN2K下用BCB5做了个键盘挂钩小程序,监视全局按键情况。Hook安放和回调函数放在一个单独DLL中,DLL原码如下:

//----------------------------------------------------------------------------------------------------
extern "C" __declspec(dllexport) void __stdcall SetHook(HWND,bool);
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) 
//----------------------------------------------------------------------------------------------------
static HINSTANCE hInstance;  // 应用实例句柄
static HWND hWndMain;      // MainForm句柄
static HHOOK hKeyHook;    // HOOK句柄
static const myMessage=2000;  // 自定义消息号
static const SecondPar=1;     // 自定义消息第2参数
//----------------------------------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{ hInstance=hinst; return 1; }
//----------------------------------------------------------------------------------------------------
void __stdcall SetHook(HWND hMainWin,bool nCode) 
{   
if(nCode) // 安放HOOK
   {
   hWndMain=hMainWin;
   hKeyHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookProc,hInstance,0);
   }
else     // 卸下HOOK
   UnhookWindowsHookEx(hKeyHook);
}
//----------------------------------------------------------------------------------------------------
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) 
{           
EVENTMSG *keyMSG=(EVENTMSG *)lParam;
if((nCode==HC_ACTION)&&(keyMSG->message==WM_KEYUP))
    PostMessage(hWndMain,myMessage,(char)(keyMSG->paramL),SecondPar);
    // 向调用窗体发消息myMessage和虚拟键码(char)(keyMSG->paramL)
return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam));
}
//----------------------------------------------------------------------------------------------------
应用代码如下:(调DLL)
//----------------------------------------------------------------------------------------------------
static HINSTANCE hDLL; // DLL句柄
typedef void __stdcall (*DLLFUN)(HWND,bool);
DLLFUN DLLSetHook;
static const myMessage=2000;
static const SecondPar=1;
//----------------------------------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
{}
//----------------------------------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hDLL=LoadLibrary((LPCTSTR)"Project1.dll"); // DLL文件名:Project1.dll
if(hDLL==NULL)
   { ShowMessage("DLL: 不能加载!程序退出。"); exit(1); }
DLLSetHook =(DLLFUN)GetProcAddress(hDLL,"SetHook");
if(DLLSetHook==NULL)
   { ShowMessage("DLL: 函数没找到!程序退出。"); FreeLibrary(hDLL); exit(1); }
DLLSetHook(this->Handle,true);
}
//----------------------------------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
DLLSetHook(NULL,false); // 卸下HOOK
FreeLibrary(hDLL);       // 卸下DLL
}
//----------------------------------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,bool &Handled)
{                     // BCB5.0 的ApplicationEvents元件
if((Msg.message==myMessage)&&(Msg.lParam==SecondPar))
   ShowMessage("  收到HOOK按键消息!\n\n 【键虚拟码】:"+IntToStr(Msg.wParam));
}
//----------------------------------------------------------------------------------------------------

用 WH_JOURNALRECORD 类型HOOK可简单实现.

时间: 2025-01-29 20:41:55

用键盘全局钩子Hook监视多进程键盘操作的相关文章

MFC线程钩子和全局钩子[HOOK DLL]

第一部分:API函数简介 1.       SetWindowsHookEx函数 函数原型 HHOOK SetWindowsHookEx(   int idHook,        // hook type   HOOKPROC lpfn,     // hook procedure   HINSTANCE hMod,    // handle to application instance   DWORD dwThreadId   // thread identifier ); 函数功能:该函

hook-C# 全局键盘监听Hook监听不到

问题描述 C# 全局键盘监听Hook监听不到 使用的是网上的Hook轮子,如下 using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Reflection;namespace HookTest { /// <summary> /// 键盘钩子 /// [以下代码来自某网

用钩子(hook)实现C#的屏幕键盘效果

要实现一个屏幕键盘,需要监听所有键盘事件,无论窗体是否被激活.因此需要一个全局的钩子,也就是系统范围的钩子. 什么是钩子(Hook) 钩子(Hook)是windows提供的一种消息处理机制平台,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该

C#的键盘鼠标钩子 问题

问题描述 网上的例子,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Diagnostics;namespaceSALON.UI{///<summary>///获取键盘输入或者USB扫描枪数据可以是没有焦点应为使用的是全局钩子///USB扫描枪是模拟键盘按下///这里主要处理扫描枪的值,手动输

防止全局钩子的入侵

Windows消息钩子一般都很熟悉了.它的用处很多,耳熟能详的就有--利用键盘钩子 获取目标进程的键盘输入,从而获得 各类密码以达到不可告人的目的.朋友想让他的软件不被别人的全局钩子监视,有没有办法实现呢?答案是 肯定的, 不过缺陷也是 有的. 首先简单看看全局钩子如何注入别的进程. 消息钩子是由Win32子系统提供,其核心部分通过NtUserSetWindowsHookEx为用户提供了设置消息钩子的系统服务,用户通过它注册全局钩子.当系统获取某些事件,比如用户按键,键盘driver将扫描码等传

解析WordPress中函数钩子hook的作用及基本用法_php技巧

WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它.钩子分类 钩子分为两种,一种叫做动作(action),还有一种叫做过滤器(filter).这两种钩子实现原理基本一样,后边会讲到,使用上的区别在于过滤器有返回值,而动作没有. 动作的理念是让你在一种情况或者一个特别的位置执行一些函数,比如发送一封邮件等:过滤器则是让你修改 WordPress 核心需要用到的一个值,然后 Wo

[Delphi]钩子(HOOK)机制的使用

                                                  [Delphi]钩子(HOOK)机制的使用     作者:e梦缘   来源:CSND  SetwindowsHookEx函数提供15种不同的消息监视类型,也就是15中不同的钩子. 分别用于捕获某一特定类型或某一范围的消息(如:键盘消息,鼠标消息等). 我们这里仅以鼠标钩子的使用为例,讨论在DELPHI下怎样编写DLL程序和怎样在自己的程序中安装使用鼠标钩子函数. Windows提供API函数Set

Delphi编程使用HOOK监视Windows

每个程序都有自己的生存空间,在Windows系统中你可以在任何时候让你的程序执行一些操作,还可以触发消息,触发的消息分为三种,一是操作你程序的界面,onClick,onMouseMove等等,另外一个可以使用Windows的消息机制来捕获一些系统消息,但是如果你想在任何时候监控任何程序的情况那可能你就会选择HOOK来实现了,虽然还有其他方法,但不得不承认,HOOK是一个比较简单解决问题的途径. 下面就来举个例子(使用Delphi7.0调试通过): 如果你需要访问某个人的机器,那在运行\\SB之后

delphi 防止结束进程 或全局钩子

问题描述 delphi 防止结束进程 或全局钩子 各位大大,我的一个程序想防止被杀,网上找了很多资料,但delphi7能用的确实没找到,只需要windows的资源管理器不能结束就ok,其他没什么要求, 像全局hook也好,或是双进程亦或是三进程守护也罢.都可以,但一定要能用.谁能给我个代码,确实很急,消息方面是我的盲区,一点都不行,之前是自己学的数据库编程,其他没经验.还请各位大大们给点源码,只要能用就行.先行谢谢了. 但如果写进系统服务中,貌似听说win7中不能用,所以暂时不考虑这东西. 解决