如何向另一个程序中的按钮发送单击消息?
发布网友
发布时间:2022-04-22 02:39
我来回答
共5个回答
热心网友
时间:2023-06-24 05:35
SendKeys 语句
将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样。
语法
SendKeys string[, wait]
SendKeys 语句的语法具有以下几个命名参数:
部分 描述
string 必需的。字符串表达式,指定要发送的按键消息。
Wait 可选的。指定等待方式的 BooleandefBooleanDataType@veendf98.chm 值。如果为 False(缺省值),则控件在按键发送出去之后立刻返回到过程。如果为 True,则按键消息必须在控件返回到过程之前加以处理。
说明
每个按键由一个或多个字符表示。为了指定单一键盘字符,必须按字符本身的键。例如,为了表示字母 A,可以用 "A" 作为 string。为了表示多个字符,就必须在字符后面直接加上另一个字符。例如,要表示 A、B 及 C,可用 "ABC" 作为 string。
对 SendKeys 来说,加号 (+)、插入符 (^)、百分比符号 (%)、上划线 (~) 及圆括号 ( ) 都具有特殊意义。为了指定上述任何一个字符,要将它放在大括号 ({}) 当中。例如,要指定正号,可用 {+} 表示。方括号 ([ ]) 对 SendKeys 来说并不具有特殊意义,但必须将它们放在大括号中。在其它应用程序中,方括号有特殊意义,在出现动态数据交换 (DDE) 的时候,它可能具有重要意义。为了指定大括号字符,请使用 {{} 及 {}}。
为了在按下按键时指定那些不显示的字符,例如 ENTER 或 TAB 以及那些表示动作而非字符的按键,请使用下列代码:
按键 代码
BACKSPACE {BACKSPACE}, {BS}, 或 {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL or DELETE {DELETE} 或 {DEL}
DOWN ARROW {DOWN}
END {END}
ENTER {ENTER}或 ~
ESC {ESC}
HELP {HELP}
HOME {HOME}
INS or INSERT {INSERT} 或 {INS}
LEFT ARROW {LEFT}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
PRINT SCREEN {PRTSC}
RIGHT ARROW {RIGHT}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
UP ARROW {UP}
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
F13 {F13}
F14 {F14}
F15 {F15}
F16 {F16}
为了指定那些与 SHIFT、CTRL 及 ALT 等按键结合的组合键,可在这些按键码的前面放置一个或多个代码,这些代码列举如下:
按键 代码
SHIFT +
CTRL ^
ALT %
为了说明在按下其它按键时应同时按下 SHIFT、CTRL、及 ALT 的任意组合键,请把那些按键的码放在括号当中。例如,为了说明按下 E 与 C 的时候同时按下 SHIFT 键,请使用 "+(EC)"。为了说明在按下 E 的时候同时按下 SHIFT 键,但接着按 C 而不按 SHIFT,则使用 "+EC"。
为了指定重复键,使用 {key number} 的形式。必须在 key 与 number 之间放置一个空格。例如,{LEFT 42} 意指 42 次按下 LEFT ARROW 键;{h 10} 则是指 10 次按下 H 键。
注意 不能用 SendKeys 将按键消息发送到这样一个应用程序,这个应用程序并没有被设计成在 Microsoft Windows 中运行。Sendkeys 也无法将 PRINT SCREEN 按键 {PRTSC} 发送到任何应用程序。
参考资料:MSDN
热心网友
时间:2023-06-24 05:36
这个简单的,是要求获得控件的句柄才能发送按键消息
我具体不知道你要发什么按键消息,就分别用sendmessage和postmessage来给你写个例子!2009QQ采用的自绘控件技术就连SPY+都找不到其控件。。
你自己添加2个按钮就行了我以记事本为例:
Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
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
Const WM_SETTEXT = &HC '设置文本的消息
Const VK_F5 = &H74 '发送F5的消息
Const WM_KEYDOWN = &H100 '发送KEYDOWN事件的消息
Dim h1 As Long 'h1是TXT窗口的句柄
Dim h2 As Long 'h2是TXT文本编辑区域的句柄
Private Sub Command1_Click()
SendMessage h2, WM_SETTEXT, 0, ByVal CStr("哈哈")
End Sub
Private Sub Command2_Click()
PostMessage h2, WM_KEYDOWN, VK_F5, 0&
End Sub
Private Sub Form_Load()
Shell "notepad.exe"
h1 = FindWindow(vbNullString, "无标题 - 记事本") 'vbNullString 是类名,"无标题 - 记事本" 是窗体名
h2 = FindWindowEx(h1, 0&, "edit", vbNullString) '父窗口句柄 子窗口句柄,如果为NULL就从第一个开始找(0& 表示无) 类名 窗体名
End Sub
热心网友
时间:2023-06-24 05:36
发送按键的方式有很多
比如
PostMessage 或 keybd_event 是利用API
SendKeys 是系统内建语句
但是都是发送的虚拟按键码
有很多软件是不接受虚拟按键码的
最常见的就是ctrl + alt +del
这个按键组合就是不接受虚拟按键码的
你无论用以上那种方式模拟这个组合键都是无效的
热心网友
时间:2023-06-24 05:37
先是findwindow 再 sendmessage,不过现在QQ2009和2008的结构有了极大的变化...
热心网友
时间:2023-06-24 05:38
Sendkey