找回密码
 加入
搜索
查看: 27262|回复: 26

[系统综合] 如何截获键盘消息

 火.. [复制链接]
发表于 2010-2-8 22:44:02 | 显示全部楼层 |阅读模式
悬赏350金钱已解决
本帖最后由 gapkiller 于 2010-2-9 11:05 编辑

所谓截获,即监听到消息,并阻止其传递下去.
在论坛上搜索了一下,大都是监听键盘消息
没有一个能做到完美截获键盘消息的.

不要用HotkeySet(), 不是所有的键都可以用HotKeySet(), 比如Windows键
期望能做到HotkeySet()的效果,只响应我的程序, 其他应用程序,一概不响应

  =2#=====================
    没搞定...
    我在写一个键盘相关程序,可能连GUI都没有. 需要用到{win}键, 但是我不期望他弹出开始菜单
    不知道au3如何搞定,困扰了我很久.

    我使用了键盘钩子来监听消息, 但是不知道如何截断掉

最佳答案

查看完整内容

7#的代码在截取到{win}键之后,只是显式的弹出一个Msgbox窗口通知用户已经截取到按键,并没有阻止这个消息的继续传递,将Msgbox去掉,改成你希望的代码并加一句Return 1试下:以上代码有误,正确应该如下:
发表于 2010-2-8 22:44:03 | 显示全部楼层
本帖最后由 pusofalse 于 2010-2-10 01:37 编辑

7#的代码在截取到{win}键之后,只是显式的弹出一个Msgbox窗口通知用户已经截取到按键,并没有阻止这个消息的继续传递,将Msgbox去掉,改成你希望的代码并加一句Return 1试下:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hHook, $hStub_KeyProc, $buf = "", $title = "", $title_1 = "", $keycode, $buffer = "", $nMsg

Local $hmod
$hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
While 1
        Sleep(1)
WEnd

Func _KeyProc($nCode, $wParam, $lParam)
        Local $tKEYHOOKS
        $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
        If $nCode < 0 Then
                Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
        EndIf
        If $wParam = $WM_KEYDOWN Then
                If $wParam = 256 Then
                        ToolTip("{win} was pressed.")
                        Return 1
                EndIf
        Else
                Local $flags = DllStructGetData($tKEYHOOKS, "flags")
                Switch $flags
                        Case $LLKHF_ALTDOWN
                                MsgBox(0, "", "拦截")
                EndSwitch
        EndIf
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func _exit()
        _WinAPI_UnhookWindowsHookEx($hHook)
        DllCallbackFree($hStub_KeyProc)
        Exit
EndFunc   ;==>_exit
以上代码有误,正确应该如下:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hHook, $hStub_KeyProc, $buf = "", $title = "", $title_1 = "", $keycode, $buffer = "", $nMsg

Local $hmod
$hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
While 1
        Sleep(1)
WEnd

Func _KeyProc($nCode, $wParam, $lParam)
        Local $tKEYHOOKS, $wVKey
        $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
        If $nCode < 0 Then
                Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
        EndIf
        $wVKey = DllStructGetData($tKEYHOOKS, "vkCode")
        If ($wVKey = 91) Then
                If ($wParam = $WM_KEYDOWN) Then
                        ToolTip("{win} was pressed.")
                        Return 1
                ElseIf ($wParam = $WM_KEYUP) Then
                        ToolTip("{win} was released.")
                EndIf
        EndIf
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc        ;==>_KeyProc

Func _exit()
        _WinAPI_UnhookWindowsHookEx($hHook)
        DllCallbackFree($hStub_KeyProc)
        Exit
EndFunc   ;==>_exit

评分

参与人数 3威望 +10 金钱 +141 贡献 +30 收起 理由
nxbigdaddy + 1
kn007 + 10 + 100 + 20 不错,学习了
gapkiller + 40 + 10 帅,敬佩!

查看全部评分

发表于 2010-2-8 23:44:14 | 显示全部楼层
学习一下这里,绝对能搞定 。http://www.autoitx.com/forum.php ... 1760&highlight=
 楼主| 发表于 2010-2-9 10:47:36 | 显示全部楼层
学习一下这里,绝对能搞定 。
bing614 发表于 2010-2-8 23:44



    没搞定...
我在写一个键盘相关程序,可能连GUI都没有.
需要用到{win}键, 但是我不期望他弹出开始菜单
不知道au3如何搞定,困扰了我很久.

我使用了键盘钩子来监听消息, 但是不知道如何截断掉
发表于 2010-2-9 10:55:02 | 显示全部楼层
win键是系统保留键,单靠AU3是不好阻止他的,目前见过的办法是用AU3调用外置DLL来解决的,可搜索关于锁机的帖子
发表于 2010-2-9 14:04:29 | 显示全部楼层
用PCBar的键盘记录器,不行?
 楼主| 发表于 2010-2-9 14:11:18 | 显示全部楼层
用PCBar的键盘记录器,不行?
kn007 发表于 2010-2-9 14:04



    那个只是监听吧...
发表于 2010-2-9 14:49:57 | 显示全部楼层
那个只是监听吧...
gapkiller 发表于 2010-2-9 14:11



自己改,懒得说了    ...
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
 
Opt('MustDeclareVars', 1)
 
Global $hHook, $hStub_KeyProc, $buf = "", $title = "", $title_1 = "", $keycode, $buffer = "", $nMsg
 
Local $hmod
$hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
While 1
        Sleep(1)
WEnd
 
Func _KeyProc($nCode, $wParam, $lParam)
        Local $tKEYHOOKS
        $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
        If $nCode < 0 Then
                Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
        EndIf
        If $wParam = $WM_KEYDOWN Then
                MsgBox(0, "", "拦截")
        Else
                Local $flags = DllStructGetData($tKEYHOOKS, "flags")
                Switch $flags
                        Case $LLKHF_ALTDOWN
                                MsgBox(0, "", "拦截")
                EndSwitch
        EndIf
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc
 
Func _exit()
        _WinAPI_UnhookWindowsHookEx($hHook)
        DllCallbackFree($hStub_KeyProc)
        Exit
EndFunc   ;==>_exit
 楼主| 发表于 2010-2-9 15:27:12 | 显示全部楼层
自己改,懒得说了    ...
kn007 发表于 2010-2-9 14:49



    1. 这个并没有拦截, 不行你把msgbox()改成tooltip()试试
2. {win}键没搞定
3. 懒得说了
发表于 2010-2-9 22:44:56 | 显示全部楼层
1. 这个并没有拦截, 不行你把msgbox()改成tooltip()试试
2. {win}键没搞定
3. 懒得说了
gapkiller 发表于 2010-2-9 15:27



    待会我找找吧。。。现在有点忙

另外我记得会 截取 啊,你在msgbox后加上return试试。。

{Windows}{Ctrl}{Ctrl}{Shift}{Shift}{Alt}{Alt}qq
发表于 2010-2-9 22:53:25 | 显示全部楼层
7#的代码在截取到{win}键之后,只是显式的弹出一个Msgbox窗口通知用户已经截取到按键,并没有阻止这个消息的 ...
pusofalse 发表于 2010-2-9 22:48



    楼上正解,Pusofalse出来了,就知道有关$WM_或Hook问题解决了
 楼主| 发表于 2010-2-9 23:26:53 | 显示全部楼层
7#的代码在截取到{win}键之后,只是显式的弹出一个Msgbox窗口通知用户已经截取到按键,并没有阻止这个消息的 ...
pusofalse 发表于 2010-2-9 22:48



    太帅了....
感谢pusofalse兄

另外改成return 0 就不行了...
有点晕..
发表于 2010-2-10 01:20:42 | 显示全部楼层
回复 12# gapkiller


    阻止消息传递时,有的需要返回0,有的需要返回1或者非0,这要看具体的消息而定~
 楼主| 发表于 2010-2-10 08:22:11 | 显示全部楼层
回复  gapkiller


    阻止消息传递时,有的需要返回0,有的需要返回1或者非0,这要看具体的消息而定~
pusofalse 发表于 2010-2-10 01:20



    迷糊...接着迷糊...
学习了!
 楼主| 发表于 2010-2-10 08:23:09 | 显示全部楼层
win键是系统保留键,单靠AU3是不好阻止他的,目前见过的办法是用AU3调用外置DLL来解决的,可搜索关于锁机的 ...
llztt 发表于 2010-2-9 10:55



    感受au3的强大吧!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 10:18 , Processed in 0.078391 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表