如下:向Word文档发送模拟按键A为什么不起作用?再就是如发送Alt+A如何作?
Private Sub Test()
GHwnd = FindWindow("OpusApp", vbNullString)
PostMessage GHwnd, WM_KEYDOWN, vbKeyA, 0
PostMessage GHwnd, WM_KEYUP, vbKeyA, 0
End Sub
Private Sub Test()
GHwnd = FindWindow("OpusApp", vbNullString)
PostMessage GHwnd, WM_KEYDOWN, vbKeyA, 0
PostMessage GHwnd, WM_KEYUP, vbKeyA, 0
End Sub
解决方案 »
- VB如何将BMP图像转换成jpg图像或gif图像?
- 请大侠帮忙vb6.0
- 感谢boywang(大力水手)的解答,请进来接分
- 出错!!!!帮我看看
- vb access2000 往表里写东东,在线等ing
- s使用datacombo控件要添加什么引用呀
- InstallShield6.x问题
- 播放AVI控件的问题,很急,帮帮我,答对立刻给分阿!
- 假如我的下拉列表有这样的内容“TWSF-BD1”,现在我想从数据库中找到包含“BD1”的纪录,请问代码如何来写?用like实现是吧?请高手赐教
- VB+ACCESS的问题(在有VB的系统可以运行,在没有安装VB就不能执行了) 100分(急!)
- 如何调整listView中行的高度?
- 如何调出WINXP系统,控制面板中的<文件夹选项>,,,,,
使用keybd_event可以实现但要焦点才行
不起作用的原因是postmessage函数发送WM_KEYDOWN(WM_KEYUP)消息时,对应的lparam参数你设置为了0(而这个参数是比较复杂的,0-31位都有其具体的含义,具体的你自己看msdn),下面是一个简单的示例,作为例子,它向窗体上的textbox发送按键"a"(当然,修改之后用于你的程序是没有问题的)Option Explicit
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Declare Function OemKeyScan Lib "user32" (ByVal wOemChar As Long) As Long
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 LongPrivate Sub Command1_Click()
'测试
PostMessage Text1.hwnd, WM_KEYDOWN, vbKeyA, ByVal GetLparam(vbKeyA, True)
PostMessage Text1.hwnd, WM_KEYUP, vbKeyA, ByVal GetLparam(vbKeyA, False)
End SubPrivate Function GetLparam(ByVal vKey As Long, ByVal flag As Boolean) As Long
Dim ScanCode As String
ScanCode = Hex(OemKeyScan(vKey) And &HFF)
Select Case flag
Case True
GetLparam = CLng("&H00" + ScanCode + "0001") 'WM_KEYDOWN对应参数
Case False
GetLparam = CLng("&HC0" + ScanCode + "0001") 'WM_KEYUP对应参数
End Select
End Function
Option Explicit
Private Const SW_RESTORE = 9
Private Declare Function PutFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long '由于vb自带一个SetFocus函数,所以改个函数名
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Sub Command1_Click()
Dim mhwnd As Long
mhwnd = &H190508 'word文档的句柄,你在实际编程中可以用findwindow获得
SetForegroundWindow mhwnd
ShowWindow mhwnd, SW_RESTORE
SendKeys "a" '想发送alt+a的话,就写成SendKeys "%a"
End Sub
另外,需要说明的是调用word对象,实现起来也很容易
GHwnd = FindWindow("OpusApp", vbNullString)
PostMessage GHwnd, WM_KEYDOWN, vbKeyA, ByVal GetLparam(vbKeyA, True)
PostMessage GHwnd, WM_KEYUP, vbKeyA, ByVal GetLparam(vbKeyA, False)
End SubPrivate Function GetLparam(ByVal vKey As Long, ByVal flag As Boolean) As Long
Dim ScanCode As String
ScanCode = Hex(OemKeyScan(vKey) And &HFF)
Select Case flag
Case True
GetLparam = CLng("&H00" + ScanCode + "0001") 'WM_KEYDOWN对应参数
Case False
GetLparam = CLng("&HC0" + ScanCode + "0001") 'WM_KEYUP对应参数
End Select
End Function