PostMessage 做游戏按键·指定窗口,按键没了反应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostMessage 做游戏按键·指定窗口,按键没了反应相关的知识,希望对你有一定的参考价值。

PostMessage hwnd, WM_KEYDOWN, (Labcombo1.Caption), MakeKeyLparam((Labcombo1.Caption), WM_KEYDOWN)
===================
Select Case Combo1.Text
Case "A": Labcombo1.Caption = &H41: Case "B": Labcombo1.Caption = &H42
Case "C": Labcombo1.Caption = &H43: Case "D": Labcombo1.Caption = &H44
=======================
上面是我不会 把全局常量(VK-A= &H41) 在 过程中 改成变量 (VK-(combo1.text))临时用的一个乱方法。
对文本有用,对游戏就没了反应!请问这是为什么呢?

参考技术A Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal Hwnd1 As Long, ByVal Hwnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Sub Form_Load()
Shell "calc.exe", vbNormalNoFocus
End Sub

Private Sub Command1_Click()
Dim Hwnd1 As Long
Dim Hwnd2 As Long
Hwnd1 = FindWindow("SciCalc", "计算器")
Hwnd2 = FindWindowEx(Hwnd1, 0, "Button", "1")
SendMessage Hwnd2, WM_LBUTTONDOWN, ByVal 0&, ByVal 0&
SendMessage Hwnd2, WM_LBUTTONUP, ByVal 0&, ByVal 0&
End Sub
参考技术B 对文本有用,看你的命令是按ABCD,ABCD对游戏有用吗?hwnd取正确吗?追问

对 游戏 没反应(网游:天龙八部),我用过别的键来试,也可以ABCD 在聊天框使用的。确定没反应!

追答

hwnd取正确的话,就可能是游戏内加了判断,屏蔽了模拟按键, 用简单的sendmessage和postmessage不行了。个人想法,仅供参考。
可以参考http://bbs.blackbap.org/forum.php?mod=viewthread&tid=564

本回答被提问者采纳
参考技术C 不知道您写成这样:VK-(combo1.text),有什么作用?如此是不能被识别为量变的。VK_A,VK_B本身没有特殊意义,只是因为咱们给它赋值,它有才了生命。比如你const vk_a=&H41,这时vk_A就被赋予十六进制值41。同样咱们也可以令VK_B=&H41,这时vb_B就被赋予十六进制41的值了。
不过vb中倒是可以这样写:Me.Controls("text" & "1").text,以读取控件text1的文本的内容(诸如Me.Controls("label" & "1").caption也是可以的),希望给你启发。追问

谢谢指点!我会去了解 学习的。
VK-(combo1.text),这只是我不懂表达 才这么说的。
combo1.text 就是 下拉框中显示的键 ,可以是键盘上的任何一个键。
这刚学,什么都不懂,不会用别的办法,,所以就这样做了。。。。
现在问题是 这个东西做出来,向窗口以送按键时
对 文本 有效
对 游戏没了反应。(网游:天龙八部)
这是为什么呢?

追答

函谷关是否感到十分鬼地方古典风格地方

如何在VB中用PostMessage向指定窗口发送带有修饰键的组合键?

向任意应用程序(包括后台的)发送任意按键消息(包括普通字符键、功能键、Shift/Control/Alt加任意按键的组合键),以实现自动执行特定功能,是一个用途很广、很有实用价值的功能,很多人都受困于此,不得其解,本人也遇到这种需求并受阻。刚开始查了很多资料和网上网友的解决方案,有些能起到一定作用,但也有许多方案经试验证实不可行。尤其是关于发送 Shift/Control/Alt 加任意按键的组合键这个问题,没有发现一个可行的方案,例如以下代码并不能向指定Window(hwnd)发送 Ctrl+C:
PostMessage hwnd,WM_KEYDOWN,VK_CONTROL,&H001D0001 \'按下Ctrl键
PostMessage hwnd,WM_KEYDOWN,VK_C,&H002E0001 \'按下C键
PostMessage hwnd,WM_KEYUP,VK_C,&HC02E0001 \'释放C键
PostMessage hwnd,WM_KEYUP,VK_CONTROL,&HC01D0001 \'释放Ctrl键
上例只能发送一个小写字母c。
以下代码虽可以模拟 Ctrl+C 按键,但却不能向指定的后台窗口发送:
keybd_event VK_Ctrl, 0, 0, 0 \'按下Ctrl键
keybd_event VK_C, 0, 0, 0 \'按下C键
keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 \'释放C键
keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 \'释放Ctrl键
难道真的没有解决这个问题的办法吗?我想这个应该是可以做到的呀,后来经过反复的研究Windows的消息机制和键盘输入系统调用的资料,终于找到了解决方案,并经试验成功证实。自己也是曾经受困于此,终得其解,不敢独享,现拿出来献给广大同需此求的朋友,也让这个问题不再是少数“高手”们独享的秘籍。
要实现向任意应用程序窗口发送模拟的按键,在不需激活该应用程序使其获得输入焦点的情况下,首先必须取得要接收按键的窗口句柄,这要用到Windows API FindWindow 及 FindWindowEx,首先用 FindWindow 取得应用程序顶层(Top Level)窗口的句柄,然后再用 FindWindowEx 取得要接收按键的子窗口或控件的句柄,因为应用程序顶层窗口不一定就是接受按键的窗口(如“NotePad.exe”记事本程序,实际接受按键的窗口是Notepad主窗口下的Edit控件),可以通过ClassID或Caption来查找。假设目标窗口的句柄已取得(hwnd),然后要用PostMessage向该窗口发送按键消息,对于普通字符键,直接用WM_CHAR消息最简单,如下:
PostMessage hwnd, WM_CHAR, Asc("A"), 0 \' 发送一个 A 字符
对于非普通字符按键,如功能键、方向键等,要用 WM_KEYDOWN、WM_KEYUP 消息,如下:
PostMessage hWndMsg, WM_KEYDOWN, VK_ESCAPE, &H00010001 \' 模拟按下 Esc 键
PostMessage hWndMsg, WM_KEYUP, VK_ESCAPE, &HC0010001 \' 模拟抬起 Esc 键
以上最后一个参数(lParam)低16位(0001)表示按键一次,高8位00表示按下,C0表示抬起,次高8位(01)表示该键的扫描码,可用 API MapVirtualKey(VirtualKey, 0)取得(注意:扫描码在各系统可能会不同,在此以具体数值示例,实际应用MapVirtualKey取得)。
下面要讲Shift/Control/Alt修饰键与其它按键的组合怎样发送,对于Shift和Control用以下方式(用到 API keybd_event):
keybd_event VK_SHIFT, &H2A, 0, 0 \' 模拟按下SHIFT键,&H2A是VK_SHIFT的扫描码
PostMessage hWndMsg, WM_KEYDOWN, VK_A, &H001E0001 \' 模拟按下 A 键,SHIFT+A产生一个大写A字符
PostMessage hWndMsg, WM_KEYUP, VK_A, &HC01E0001 \' 模拟抬起 A 键
keybd_event VK_SHIFT, &H2A, KEYEVENTF_KEYUP, 0 \' 模拟抬起 SHIFT 键
以上VK_SHIFT(扫描码2A)换成VK_CONTROL(扫描码1D)就可以实现Ctrl组合键,VK_A(扫描码1E)也可以换成任意功能键,如VK_F4(扫描码3E)。
对于Alt修饰键比较特别,它属于系统按键,要用 WM_SYSKEYDOWN/WM_SYSKEYUP 消息,如下:
PostMessage hWndMsg, WM_SYSKEYDOWN, VK_F4, &H003E0001 Or &H20000000 \' 模拟按下 Alt+F4
PostMessage hWndMsg, WM_SYSKEYUP, VK_F4, &HC03E0001 Or &H20000000 \' 模拟抬起 Alt+F4
\' &H20000000 为 context code 位,置 1 表示 Alt 键被按下

至此,大功告成,祝各位心情愉快。
参考技术A 向任意应用程序(包括后台的)发送任意按键消息(包括普通字符键、功能键、Shift/Control/Alt加任意按键的组合键),以实现自动执行特定功能,是一个用途很广、很有实用价值的功能,很多人都受困于此,不得其解,本人也遇到这种需求并受阻。刚开始查了很多资料和网上网友的解决方案,有些能起到一定作用,但也有许多方案经试验证实不可行。尤其是关于发送 Shift/Control/Alt 加任意按键的组合键这个问题,没有发现一个可行的方案,例如以下代码并不能向指定Window(hwnd)发送 Ctrl+C:
PostMessage hwnd,WM_KEYDOWN,VK_CONTROL,&H001D0001 '按下Ctrl键
PostMessage hwnd,WM_KEYDOWN,VK_C,&H002E0001 '按下C键
PostMessage hwnd,WM_KEYUP,VK_C,&HC02E0001 '释放C键
PostMessage hwnd,WM_KEYUP,VK_CONTROL,&HC01D0001 '释放Ctrl键
上例只能发送一个小写字母c。
以下代码虽可以模拟 Ctrl+C 按键,但却不能向指定的后台窗口发送:
keybd_event VK_Ctrl, 0, 0, 0 '按下Ctrl键
keybd_event VK_C, 0, 0, 0 '按下C键
keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 '释放C键
keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 '释放Ctrl键
难道真的没有解决这个问题的办法吗?我想这个应该是可以做到的呀!后来经过反复的研究Windows的消息机制和键盘输入系统调用的资料,终于找到了解决方案,并经试验成功证实。自己也是曾经受困于此,终得其解,不敢独享,现拿出来献给广大同需此求的朋友,也让这个问题不再是少数“高手”们独享的秘籍。
要实现向任意应用程序窗口发送模拟的按键,在不需激活该应用程序使其获得输入焦点的情况下,首先必须取得要接收按键的窗口句柄,这要用到Windows API FindWindow 及 FindWindowEx,首先用 FindWindow 取得应用程序顶层(Top Level)窗口的句柄,然后再用 FindWindowEx 取得要接收按键的子窗口或控件的句柄,因为应用程序顶层窗口不一定就是接受按键的窗口(如“NotePad.exe”记事本程序,实际接受按键的窗口是Notepad主窗口下的Edit控件),可以通过ClassID或Caption来查找。假设目标窗口的句柄已取得(hwnd),然后要用PostMessage向该窗口发送按键消息,对于普通字符键,直接用WM_CHAR消息最简单,如下:
PostMessage hwnd, WM_CHAR, Asc("A"), 0 ' 发送一个 A 字符
对于非普通字符按键,如功能键、方向键等,要用 WM_KEYDOWN、WM_KEYUP 消息,如下:
PostMessage hWndMsg, WM_KEYDOWN, VK_ESCAPE, &H00010001 ' 模拟按下 Esc 键
PostMessage hWndMsg, WM_KEYUP, VK_ESCAPE, &HC0010001 ' 模拟抬起 Esc 键
以上最后一个参数(lParam)低16位(0001)表示按键一次,高8位00表示按下,C0表示抬起,次高8位(01)表示该键的扫描码,可用 API MapVirtualKey(VirtualKey, 0)取得(注意:扫描码在各系统可能会不同,在此以具体数值示例,实际应用MapVirtualKey取得)。
下面要讲Shift/Control/Alt修饰键与其它按键的组合怎样发送,对于Shift和Control用以下方式(用到 API keybd_event):
keybd_event VK_SHIFT, &H2A, 0, 0 ' 模拟按下SHIFT键,&H2A是VK_SHIFT的扫描码
PostMessage hWndMsg, WM_KEYDOWN, VK_A, &H001E0001 ' 模拟按下 A 键,SHIFT+A产生一个大写A字符
PostMessage hWndMsg, WM_KEYUP, VK_A, &HC01E0001 ' 模拟抬起 A 键
keybd_event VK_SHIFT, &H2A, KEYEVENTF_KEYUP, 0 ' 模拟抬起 SHIFT 键
以上VK_SHIFT(扫描码2A)换成VK_CONTROL(扫描码1D)就可以实现Ctrl组合键,VK_A(扫描码1E)也可以换成任意功能键,如VK_F4(扫描码3E)。
对于Alt修饰键比较特别,它属于系统按键,要用 WM_SYSKEYDOWN/WM_SYSKEYUP 消息,如下:
PostMessage hWndMsg, WM_SYSKEYDOWN, VK_F4, &H003E0001 Or &H20000000 ' 模拟按下 Alt+F4
PostMessage hWndMsg, WM_SYSKEYUP, VK_F4, &HC03E0001 Or &H20000000 ' 模拟抬起 Alt+F4
' &H20000000 为 context code 位,置 1 表示 Alt 键被按下

至此,大功告成!祝各位心情愉快!本回答被提问者采纳

以上是关于PostMessage 做游戏按键·指定窗口,按键没了反应的主要内容,如果未能解决你的问题,请参考以下文章

VB Postmessage发送字符串问题

VC6.0我用PostMessage向某窗口发送按键消息循环 但每次按键的时候都有咚咚的声音怎么能去掉呢

C#中如何向指定的窗口或程序发送按键?

易语言,怎么对指定窗口模拟鼠标点击和按键,可以后台的

按键精灵8,获取句柄有些只有窗口类名,没有窗口标题,该怎么办?

如何用按键精灵实现游戏多开,鼠标按键同步操作