找回密码  加入

AUTOIT CN

搜索
查看: 125|回复: 7

[系统综合] 关于_PostMessage后台发送键盘指令问题

[复制链接]
发表于 2019-9-8 11:13:01 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 liupeng1990607 于 2019-9-12 09:23 编辑

  1. #include <WinAPIEx.au3>
  2. #include <WinAPIvkeysConstants.au3>
  3. #include <WindowsConstants.au3>
  4. #RequireAdmin

  5. HotKeySet("{f2}","runll")
  6. HotKeySet("{f3}","lexit")

  7. $flag = True
  8.         
  9. While 1

  10. WEnd

  11. Func runll()
  12.         $flag = True
  13.         $hWnd=WinGetHandle("记事本XXX")
  14.         $hCnd=ControlGetHandle($hWnd,"","")
  15.         $index = 0
  16.         While $flag = True
  17.                 $index = $index + 1
  18.                 If Mod($index,5) = 0 Then
  19.                    _SendKeys($hCnd,"{ctrl}_s")
  20.                 EndIf
  21.         WEnd
  22. EndFunc

  23. Func lexit()
  24.         $flag = False
  25. EndFunc

  26. Func _SendString($hWnd, $Str)
  27.         For $s = 1 To StringLen($Str)
  28.                 $St = StringMid($Str, $s, 1)
  29.                 If Asc($St) < 128 Then ;虚拟键码小于128为英文
  30.                         _PostMessage($hWnd, 0x286, Asc($St), 0);WM_IME_CHAR
  31.                 Else;大于127为中文
  32.                         $IME = StringToASCIIArray($St, 0, 1, 1)
  33.                         Local $ASCs = '0x'
  34.                         For $a = 0 To UBound($IME) - 1
  35.                                 $ASCs &= Hex($IME[$a], 2);合并内码
  36.                         Next
  37.                         _PostMessage($hWnd, 0x286, $ASCs, 0);WM_IME_CHAR
  38.                 EndIf
  39.         Next
  40.         ;使用_SendMessageA也行
  41. EndFunc   ;==>_SendString

  42. Func _MouseClick($hWnd, $x, $y, $button = 'left', $times = 1, $delay = 250)
  43.         Local $ix
  44.         Local $lParam = BitOR(BitAND($x, 0xFFFF), $y * 0x10000)
  45.         $button = StringLower($button)
  46.         If $button = "left" Then
  47.                 For $ix = 1 To $times
  48.                         _PostMessage($hWnd, 0x200, 0, $lParam);WM_MOUSEMOVE
  49.                         _PostMessage($hWnd, 0x201, 1, $lParam);WM_LBUTTONDOWN
  50.                         _PostMessage($hWnd, 0x202, 0, $lParam);WM_LBUTTONUP
  51.                         If $ix < $times Then Sleep($delay)
  52.                 Next
  53.         ElseIf $button = "right" Then
  54.                 For $ix = 1 To $times
  55.                         _PostMessage($hWnd, 0x200, 0, $lParam);WM_MOUSEMOVE
  56.                         _PostMessage($hWnd, 0x204, 2, $lParam);WM_RBUTTONDOWN
  57.                         _PostMessage($hWnd, 0x205, 0, $lParam);WM_RBUTTONUP
  58.                         If $ix < $times Then Sleep($delay)
  59.                 Next
  60.         EndIf
  61. EndFunc   ;==>_MouseClick

  62. Func _SendKeys($hWnd, $iKeys,  $isBack = True)
  63.         $iKeys = StringUpper($iKeys)
  64.         If $hWnd <= 0 Or $iKeys = '' Then Return
  65.         Local $ShiftDown = False, $CtrlDown = False, $AltDown = False, $CompKey = False
  66.         
  67.         If StringInStr($iKeys, '_') Then $CompKey = True ;'_'为组合键分隔符
  68.         If $CompKey Then
  69.                 If StringInStr($iKeys, '{SHIFT}') Then
  70.                         Send('{SHIFTDOWN}')
  71.                         $ShiftDown = True
  72.                 EndIf
  73.                 If StringInStr($iKeys, '{CTRL}') Then
  74.                         Send('{CTRLDOWN}')
  75.                         $CtrlDown = True
  76.                 EndIf
  77.                 If StringInStr($iKeys, '{ALT}') Then
  78.                         Send('{ALTDOWN}')
  79.                         $AltDown = True
  80.                 EndIf
  81.                 $K = StringSplit($iKeys, '_', 1)
  82.                 If @error Then Return
  83.                 $iKeys = $K[$K[0]]
  84.         EndIf
  85.         If $isBack Then
  86.                 $iKeys = _IntVirtualKey($iKeys)
  87.                 $MapVK = _MapVirtualKey($iKeys, 0)
  88.                 $lParam = BitOR($MapVK * 0x10000, BitAND(1, 0xFFFF))
  89.                 _PostMessage($hWnd, 0x100, $iKeys, $lParam);WM_KEYDOWN
  90.                 _PostMessage($hWnd, 0x101, $iKeys, $lParam + 0xC0000000);WM_KEYUP
  91.         Else
  92.                 $iKeys = StringLower($iKeys)
  93.                 ;Send('{ASC 0' & $iKeys & '}')
  94.                 Send($iKeys)
  95.         EndIf
  96.         If $AltDown Then Send('{ALTUP}');弹起alt
  97.         If $CtrlDown Then Send('{CTRLUP}');弹起ctrl
  98.         If $ShiftDown Then Send('{SHIFTUP}');弹起shift
  99. EndFunc   ;==>_SendKeys

  100. Func _MapVirtualKey($iCode, $iType)
  101.         Local $Ret = DllCall('user32.dll', 'uint', 'MapVirtualKeyW', 'uint', $iCode, 'uint', $iType)
  102.         If (@error) Or (Not $Ret[0]) Then Return ''
  103.         Return $Ret[0]
  104. EndFunc   ;==>_MapVirtualKey

  105. Func _IntVirtualKey($iKey)
  106.         If $iKey == '{BS}' Then Return 0x08
  107.         If $iKey == '{TAB}' Then Return 0x09
  108.         If $iKey == '{SHIFT}' Then Return 0x10
  109.         If $iKey == '{CTRL}' Then Return 0x11
  110.         If $iKey == '{ENTER}' Then Return 0x0D
  111.         If $iKey == '{CLEAR}' Then Return 0x0C
  112.         If $iKey == '{ALT}' Then Return 0x12
  113.         If $iKey == '{PAUSE}' Then Return 0x13
  114.         If $iKey == '{CAPS LOCK}' Then Return 0x14
  115.         If $iKey == '{ESC}' Then Return 0x1B
  116.         If $iKey == '{SPACEBAR}' Then Return 0x20
  117.         If $iKey == '{PAGEUP}' Then Return 0x21
  118.         If $iKey == '{PAGEDOWN}' Then Return 0x22
  119.         If $iKey == '{END}' Then Return 0x23
  120.         If $iKey == '{HOME}' Then Return 0x24
  121.         If $iKey == '{LEFT}' Then Return 0x25
  122.         If $iKey == '{UP}' Then Return 0x26
  123.         If $iKey == '{RIGHT}' Then Return 0x27
  124.         If $iKey == '{DOWN}' Then Return 0x28
  125.         If $iKey == '{SELECT}' Then Return 0x29
  126.         If $iKey == '{PRINT}' Then Return 0x2A
  127.         If $iKey == '{EXECUTE}' Then Return 0x2B
  128.         If $iKey == '{PRINTSCREEN}' Then Return 0x2C
  129.         If $iKey == '{INS}' Then Return 0x2D
  130.         If $iKey == '{DEL}' Then Return 0x2E
  131.         If $iKey == '{F1}' Then Return 0x70
  132.         If $iKey == '{F2}' Then Return 0x71
  133.         If $iKey == '{F3}' Then Return 0x72
  134.         If $iKey == '{F4}' Then Return 0x73
  135.         If $iKey == '{F5}' Then Return 0x74
  136.         If $iKey == '{F6}' Then Return 0x75
  137.         If $iKey == '{F7}' Then Return 0x76
  138.         If $iKey == '{F8}' Then Return 0x77
  139.         If $iKey == '{F9}' Then Return 0x78
  140.         If $iKey == '{F10}' Then Return 0x79
  141.         If $iKey == '{F11}' Then Return 0x7A
  142.         If $iKey == '{F12}' Then Return 0x7B
  143.         If $iKey == '{F13}' Then Return 0x7C
  144.         If $iKey == '{F14}' Then Return 0x7D
  145.         If $iKey == '{F15}' Then Return 0x7E
  146.         If $iKey == '{F16}' Then Return 0x7F
  147.         If $iKey == '{NUM LOCK}' Then Return 0x90
  148.         If $iKey == '{SCROLL LOCK}' Then Return 0x91
  149.         If $iKey == '*' Then Return 0x6A
  150.         If $iKey == '+' Then Return 0x6B
  151.         If $iKey == '-' Then Return 0x6D ;BD
  152.         If $iKey == '.' Then Return 0x6E
  153.         If $iKey == '/' Then Return 0x6F
  154.         If $iKey == ';' Then Return 0xBA
  155.         If $iKey == '=' Then Return 0xBB
  156.         If $iKey == ',' Then Return 0xBC
  157.         If $iKey == '`' Then Return 0xC0
  158.         If $iKey == '[' Then Return 0xDB
  159.         If $iKey == '\' Then Return 0xDC
  160.         If $iKey == ']' Then Return 0xDD
  161.         Return Asc($iKey)
  162. EndFunc   ;==>_MakeVirtualKey

  163. Func _PostMessage($hWnd, $iMsg, $iwParam, $ilParam)
  164.         DllCall("user32.dll", "bool", "PostMessage", "hwnd", $hWnd, "uint", $iMsg, "wparam", $iwParam, "lparam", $ilParam)
  165. EndFunc   ;==>_WinAPI_PostMessage
复制代码


后台发送键盘指令没有问题,但是发送指令的时候会影响电脑前台使用,前台按键时会冲突,请问 有什么好的办法,可以实现后台按键并且也不影响其他窗口按键使用呢?

 楼主| 发表于 2019-9-9 15:38:14 | 显示全部楼层
帖子要沉了,怎么办 心好慌~
回复

使用道具 举报

 楼主| 发表于 2019-9-12 09:22:25 | 显示全部楼层
帖子要沉了,怎么办 心好慌  +1
回复

使用道具 举报

发表于 2019-9-12 10:07:12 | 显示全部楼层
后台时 Break(模式) 限制前台
回复

使用道具 举报

 楼主| 发表于 2019-9-12 10:58:46 | 显示全部楼层
本帖最后由 liupeng1990607 于 2019-9-12 11:25 编辑
afan 发表于 2019-9-12 10:07
后台时 Break(模式) 限制前台

不能2个同时支持吗,只能同一时间只能一个吗。break 不是禁用不能托盘退出吗,这个跟我这个有撒关联 怎么使用呢
回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
再来看看~~~~
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层

记错了,不是Break,应该用   
BlockInput($BI_DISABLE)  ; 禁用用户的鼠标和键盘输入.
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
每次 post 键击前 BlockInput($BI_DISABLE)
完事后立即解禁 BlockInput($BI_ENABLE) 以避免冻屏的麻烦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|小黑屋|手机版|AUTOIT CN ( Autoit8.com )谷歌 百度

GMT+8, 2019-9-21 06:40 , Processed in 0.078125 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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