tumuyan 发表于 2018-6-24 22:36:12

send("{LEFT donw}")没有产生长按按键的效果

本帖最后由 tumuyan 于 2018-6-25 17:52 编辑

(原先没有将清除,修改了下)
我需要用autoit模拟一直按着按键。
比如一直按着物理键盘的LEFT不松,光标是连续前移的。

查询资料,这样写了

send("{LEFT down}")


但是实际上每运行一次,光标只向前移动一位。

怎样才能模拟真正物理按键的效果?
(因为我长按按键之后,需要去处理串口通讯信息,当收到信息的时候自动松开按键。所以不确认需要按多长时间/多少次,也不能设置热键来取消。所以不可能使用延时来操作)

kk_lee69 发表于 2018-6-25 00:26:13

搜尋一下鍵盤鉤子

tumuyan 发表于 2018-6-25 09:52:33

kk_lee69 发表于 2018-6-25 00:26
搜尋一下鍵盤鉤子

我搜索了下键盘钩子是阻止物理键盘发送的数据,好像不能解决我的问题?

kk_lee69 发表于 2018-6-25 10:55:45

tumuyan 发表于 2018-6-25 09:52
我搜索了下键盘钩子是阻止物理键盘发送的数据,好像不能解决我的问题?

既然可以阻止就表示 可以攔截   攔截後 做完你想做的   不就是可以???

xzf680 发表于 2018-6-25 10:58:14

这个比较容易实现吧!

#include <Misc.au3>
#include <MsgBoxConstants.au3>

Local $hDLL = DllOpen("user32.dll")

While 1
    If _IsPressed("27", $hDLL)Then
               ; 一直等待,直到按键被释放
      While _IsPressed("27", $hDLL)
                        ConsoleWrite(" 当前按下 → 键 " & @CRLF)
            Sleep(250)
      WEnd
    ElseIf _IsPressed("1B", $hDLL) Then
      MsgBox($MB_SYSTEMMODAL, "_IsPressed", "按下 Esc 键, 将关闭该应用程序.")
      ExitLoop
    EndIf
    Sleep(250)
WEnd

DllClose($hDLL)

tumuyan 发表于 2018-6-25 17:53:37

xzf680 发表于 2018-6-25 10:58
这个比较容易实现吧!

#include


我没有讲明白,修改了下帖子

tumuyan 发表于 2018-6-25 17:56:33

kk_lee69 发表于 2018-6-25 10:55
既然可以阻止就表示 可以攔截   攔截後 做完你想做的   不就是可以???

我需要模拟一直按着某个按键不放,并不需要拦截
问题没有讲清楚,我改了帖子了

kk_lee69 发表于 2018-6-25 18:03:07

tumuyan 发表于 2018-6-25 17:56
我需要模拟一直按着某个按键不放,并不需要拦截
问题没有讲清楚,我改了帖子了

你按下哪邊後模擬 某個按鍵 按住不放

tumuyan 发表于 2018-6-25 18:18:11

kk_lee69 发表于 2018-6-25 18:03
你按下哪邊後模擬 某個按鍵 按住不放


我做了一个串口模拟键盘。外接设备通过串口发送指令到电脑,电脑收到指令后解析指令并做动作。
现在数据可以解析,但是动作做不出来。
比如收到指令“PP8”我希望模拟键盘长按“LEFT”,直到收到后边新的指令,我去把LEFT释放掉。
官方说明文档里是用 send("{LEFT donw}")的写法,但是实际表现和长按按键是不一样的


kk_lee69 发表于 2018-6-25 20:24:46

tumuyan 发表于 2018-6-25 18:18
我做了一个串口模拟键盘。外接设备通过串口发送指令到电脑,电脑收到指令后解析指令并做动作。
现在数 ...

保持某鍵按下狀態:
    Send("{a down}") ;保持 A 鍵按下
    Send("{a up}") ;釋放 A 鍵

按下跟 釋放   是兩個動作你用鍵盤攔截 也是兩個動作分開

但是 他不會重複的一直送資料..................

按一下只會送 一次但是 光是 按一下的動作一樣 有 DOWN 跟 UP

所以DOWN 跟 UP
跟 送資料無關

kk_lee69 发表于 2018-6-25 20:46:02

tumuyan 发表于 2018-6-25 18:18
我做了一个串口模拟键盘。外接设备通过串口发送指令到电脑,电脑收到指令后解析指令并做动作。
现在数 ...

簡單的說

长按按键的效果= down + 循環送出left + UP + 停止送出

SEND DOWN就只是 DOWN   

循環送出 left 要自己寫

kk_lee69 发表于 2018-6-25 21:06:48

tumuyan 发表于 2018-6-25 18:18
我做了一个串口模拟键盘。外接设备通过串口发送指令到电脑,电脑收到指令后解析指令并做动作。
现在数 ...

你的問題 其實 分兩段

1. LEFT donw 為何沒有 長按效果    答案的確就是這樣原因 前面我有解釋

2收到 指令模擬長按 LEFT

這個 請看下面範例

你 再輸入框 輸入PP8 看看

Local $file, $btn, $msg ,$CHK=0

GUICreate("我的?入框 GUI", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); 接受拖?文件 WS_EX_ACCEPTFILES
$file = GUICtrlCreateInput("", 10, 5, 300, 20)
$btn = GUICtrlCreateButton("确定", 40, 75, 60, 20)

GUISetState()

$msg = 0
While $msg <> -3
        IF GUICtrlRead($file)="PP8" Then
                $CHK=1
                ConsoleWrite("送出你想送的 譬如A"&@CRLF)
                ConsoleWrite('SEND("{LEFT}")'&@CRLF)
        Else
                IF $CHK=1 Then
                        ConsoleWrite("停止發送")
                        $CHK=0
                Else
                       
                EndIf       
        EndIf

    $msg = GUIGetMsg()
    Select
      Case $msg = $btn
         ExitLoop
    EndSelect
WEnd

tumuyan 发表于 2018-6-25 22:22:33

kk_lee69 发表于 2018-6-25 21:06
你的問題 其實 分兩段

1. LEFT donw 為何沒有 長按效果    答案的確就是這樣原因 前面我有解釋
...

我查到原因了。windows会连续动作是因为系统本身有这个选项。
使用key down有不同的效果可能是因为autoit的send绕过了这个机制。
通过测试,我发现系统最高发送频率约30ms发送1次


tumuyan 发表于 2018-6-26 00:05:21

本帖最后由 tumuyan 于 2018-6-26 01:29 编辑

kk_lee69 发表于 2018-6-25 21:06
你的問題 其實 分兩段

1. LEFT donw 為何沒有 長按效果    答案的確就是這樣原因 前面我有解釋
...
你的说法没错。
这样由于我要一边处理串口信息、响应操作界面,一边去按照固定频率(30ms)模拟连续发送按键动作,所以需要多线程操作了。

应该已经解决了。
页: [1]
查看完整版本: send("{LEFT donw}")没有产生长按按键的效果