b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

全局 非鼠标钩子 STM32()分两步:DLL,的设置

电脑杂谈  发布时间:2021-04-09 05:01:28  来源:网络整理

分两个步骤创建一个全局鼠标挂钩:DLL,并在DLL中实现挂钩设置,释放和挂钩功能; 二、构建另一个项目以调用测试。 -------------------------------------------------- ------------------------------ 一、创建DLL的第一步:首先创建一个DLL项目,然后自动初始化代码如下(删除注释):----------------------------------------- -------------------------------------- lib raryProj ect1; usesSysUtils,Classs; {$ R *。 res} b eginend。 -------------------------------------------------- ------------------------------ //将项目另存为MyHook。 dp r,并实现如下:lib raryMyHook; usingSysUtils,Windows,{挂钩函数全部来自Windows单元}消息,{消息WM_ LBUTTON DOW在消息单元中定义}类; N {$ R *。

res)varhook:HHOOK; {hook变量} {hook函数,太多的鼠标消息(例如鼠标移动),必须有一个选择,这里是按下鼠标左键的选择)functionMouseHook(nCode:Integer ; wParam:WPARAM; lParam:LPARAM):LRESULT; stdcall; b eginwParam = WM_ LBUTTON DOWthenifNb eginMessageBeep(0); end; Result:= CallN extHookEx(hook,nCode,wParam,lParam); end; {建立挂钩} functionSetHook :Boolean; stdcall; b eginhook:= SetWindowsHookEx(WH_ MOUSE,@ MouseHook,HInstance,0);结果:= hook0; end; {release hook} functionDelHook:Boolean; stdcall; b eginResult:= UnhookWindowsHookEx(hook); end ; {通过DLL所需的输出函数} expOrtsSetHookname'SetHook',DelHookname'DelHook',MouseHookname'MouseHook'; // SetHook,DelHook,MouseHook; {如果不需要更改名称,则可以直接进行expts } b eginend。

--------------------------------------------------- ---------------------------------注意:SetWindowsHookEx的第一个参数WH_MOUSE表示这是一个鼠标钩;四个参数0表示它是全局的。鼠标钩子回调函数的格式为此处,然后按Ctrl + F9进行编译,将在项目目录中生成与项目同名的文件,该文件为:MyHook。 dll。 -------------------------------------------------- ------------------------------第2步:调用,保存并放入刚刚制作的MyHook。 dll复制到该项目目录;实现如下:-------------------------------------- ------ ------------------------------------创建新项目后,添加两个按钮unitUnit1;界面使用Windows,消息,SysUtils,变量,类,图形,控件,表单,对话框,StdCtrls;典型的eTForm1 = class(TForm)Button1:TButton; Button2:TButton; p rocedureButton1Click(Sender:TOb ject); p rocedureButton2Click(Sender:TOb jClick) ect); end; {DLL中的函数声明} functionSetHook:Boolean; stdcall; functionDelHook:Boolean; stdcall; varForm1:TForm1; imp lementation {$ R *。

dfm} {DLL中的函数实现,这意味着它来自其最初的命名位置} functionSetHook; external'MyHook。 dll'名称'SetHook'; functionDelHook;外部'MyHook。 dll'name'DelHook'; {build hook} p rocedureTForm1。 Button1Click(Sender:TOb ject); b eginSetHook; end; {destroy hook} p rocedureTForm1。 Button2Click(Sender:TOb ject); b eginDelHook; end; end。 -------------------------------------------------- ------------------------------测试:单击第一个按钮后,挂钩被激活;无论鼠标在哪里,都单击鼠标左键以“单击”;单击第二个按钮以缩回挂钩。 -------------------------------------------------- ------------------------------以下是动态调用的方法,功能与上面完全相同:- ----- --------------------------------------------- ----- ------------------------ unitUnit1;界面使用Windows,消息,SysUtils,变量,类,图形,控件,表单,对话框, StdCtrls; typ eTForm1 = class(TForm)Button1:TButton; Button2:TButton; p rocedureButton1Click(Sender:TOb ject); p rocedureButton2Click(Sender:TOb ject); end; varForm1:TForm1; imp lementation {$ R *。

dfm} {您必须首先使用与DLL中相同的参数并返回值来定义函数类型} typ eTDLLFun = function:Boolean; stdcall; {现在所需的DLL中函数的格式都是这样,只需定义一个} Varh:HWN D; {声明一个DLL句柄} SetHook,DelHook:TDLLFun; {声明两个TDLLFun变量} {加载DLL并调用其函数} p rocedureTForm1。 Button1Click(Sender:TOb ject); b eginh:= LoadLib rary('MyHook.dll'); {Load DLL and get handle} ifh0thenb eginSetHook:= GetProcAddress(h,'SetHook'); {让SetHook指向DLL相应的函数)DelHook:= GetProcAddress(h,'DelHook'); {让DelHook指向DLL中的相应函数} endelseShowMessage('Err'); SetHook; {执行钩子建立函数,此处为SetHook及其指向的函数相同名称也可以不同}结尾; {destroy hook and release DLL} p rocedureTForm1。

键盘鼠标全局钩子程序_全局 非鼠标钩子_全局 非鼠标钩子

Button2Click(Sender:TOb ject); b eginDelHook; {执行挂钩释放功能} FreeLib rary(h); {释放DLL资源}结束;结束。 -------------------------------------------------- ------------------------------为什么全局钩子必须位于DLL中? EXE是一个独立且封闭的过程; DLL是系统的公共资源。 ,恐怕意义不大;因此,在实践中,钩子与DLL是分不开的。是在“袋子”里吗?我还没有尝试过。 -------------------------------------------------- ------------------------------因为钩子不是面向系统的,所以请问每个人:全局钩子可以在SetWindowsHookEx函数的第一个参数指示挂钩的类型。有14个选项。我们之前使用过两个:WH_键盘和WH_鼠标。系统将为每种类型的挂钩创建一个表(即14个表)。例如,如果应用程序启动了键盘挂钩,那么我们自己的程序也会启动键盘,并且相同的键盘挂钩将输入相同的表。

此表(可能不止一个,可能有鼠标钩等)是传说中的“钩链”。如果某个挂钩链中有三个挂钩(例如,挂钩A,挂钩B和挂钩C依次出现),则将首先执行最后一个条目“挂钩C”。 ?我认为应该说:后进先出!有区别吗?是的!因为第一个不一定会出来。 ,是否可以执行之前进入的钩子(钩子A,钩子B),必须由正在执行的“钩子C”确定。 “挂钩C”的功能包含CallN extHookEx语句,然后可以使用“挂钩A,挂钩B”;否则,它只等待相应的那个先出现,然后再出现,最后一个钩子将首先执行。说如果可以被UnhookWindowsHookEx每天带走(我想到了赵本山的素描...)。这时,您可能会认为:太好了,以后我将不再添加CallN extHookEx,只是让我的钩子“运行”;?但是如果您首先执行钩子,Windows建议:钩子函数应调用CallN extHookEx,并将其返回值视为钩子函数本身的返回值。因此,CallN extHookEx还必须将参数传递给钩子链中的下一个(也许应该称为前一个)钩子(例如,在键盘上)。消息中按下了哪个键?当然,它们是不相同的,因此它们不在同一“链”中。同一链中钩子的类型必须相同。

键盘鼠标全局钩子程序_全局 非鼠标钩子_全局 非鼠标钩子

键盘钩和鼠标钩的参数是否相同?让我们谈谈钩子函数的返回值:钩子函数的返回值,我们遵循Windows约定并返回CallN extHookEx的返回值。如果CallN extHookEx成功,它将返回下一个钩子的返回值,该钩子是一个链。如果CallN extHookEx失败,它将返回0,因此该钩子链将断开,并且只有当前的钩子仍在执行任务。在此之前,如果不同类型的钩子函数的返回值不同,则如果键盘钩子返回非零值,则意味着消息在处理后将被销毁。换句话说:结果:= 0;这意味着消息在被钩子拦截并处理后被“释放”;结果:= 1;这意味着该消息在被钩子拦截并处理后被“杀死”。如果键盘的挂钩函数在下面的示例中,则只需简单地不使用CallN extHookEx(无论如何,我暂时就是一个挂钩),然后直接返回即可!值这是下一个示例的演示:在中,我在三种状态下为Memo输入了字母a,并且可以正常输入Memo。 0,钩子后,首先执行钩子函数的功能(返回键值),还可以输入字母a; 0值(例如1),在执行钩子操作后,仅执行钩子函数的功能(返回键值),并且糟糕的备注不知道发生了什么。当钩子未启动时,钩子函数返回时并且钩子函数不返回,但是再次出现一个新问题:钩子函数返回键值时会发生什么。

。 。是不是一个?在Bee测试中,您发现声音不止一次了吗?这是事实。因为按一次该键将发出两条消息:WM_ KEYDOWN,WM_ KEYUP,所以我们没有指定要拦截的消息。首先提醒:我在前面用p阻止了它?秘密在键盘挂钩函数的第三个参数lParam中。等待下一个主题。如何区分这两种消息?//示例代码:unitUnit1; interfaces使用Windows,Messages,SysUtils,Variant,Classes,Grap hics,Controls,Forms,Dialogs,StdCtrls; typ eTForm1 = class(TForm)Button1:TButton; Button2:TButton; Memo1:TMemo; p rocedureFormDestroy(Sender:TOb ject); p rocedureButton1Click(Sender:TOb ject); p rocedureButton2Click(Sender:TOb ject); end;(hook函数声明)functionMyKeyHook(nCode:Integer ; wParam:WPARAM; lParam:LPARAM):LRESULT; stdcall; varForm1:TForm1;实现{$ R *。

dfm} varhook:HHOOK; functionMyKeyHook(nCode:Integer; wParam:WPARAM; lParam:LPARAM):LRESULT; b eginForm1。备忘1。线。 Add(IntToStr(wParam)); {第二个参数是键值}结果:= 0; {测试分别返回0或非零}结束; {发送钩子} rocedureTForm1。 Button1Click(Sender:TOb ject); b例如,inhook:= SetWindowsHookEx(WH_KEYBOARD,MyKeyHook,HInstance,GetCurrentThreadId);备注1。清除;文本:=“挂钩开始”;结束; {retract hook} p rocedureTForm1。 Button2Click(Sender:TOb ject); b eginUnhookWindowsHookEx(hook); Text:='Hook is closed'; end; {如果忘记收回挂钩, 。 。 } p rocedureTForm1。 FormDestroy(Sender:TOb ject); b eginifhook0thenUnhookWindowsHookEx(hook); end; end。小秘密:我没找到。这次,在SetWindowsHookEx中,第二个参数(函数地址)未使用@和Addr。如何运作?它没有用,因为函数名称本身是一个地址。原始地址:http:// www。 xm5。 org / b ook / 7 /


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-366898-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 宵风
        宵风

        他有九零后这个群体新锐逗玩不服输的鲜特质

      热点图片
      拼命载入中...