Board logo

标题: sendkeys和API 函数sendmessage,该用哪个?? [打印本页]

作者: 只爱陌生人    时间: 2006-11-27 21:30     标题: sendkeys和API 函数sendmessage,该用哪个??

用sendkeys可以发送字符串( 也可以包含中文?!)到当前最上层的程序的具有输入焦点的窗口中,但是,如果只想发送到某一固定的程序,在sendkeys之前好像得用appActivate来激活该程序。(可以不用激活,就可以发送吗??)

用api 函数sendmessage可以发送各种消息到目标程序,而不用使目标程序是当前活动窗口。但是,sendmessages可以发送包含有中文的复杂的字符串吗???
急用,谢谢!!!
作者: Nothing    时间: 2006-11-28 10:56

sendmessages应当可以发送中文,sendkeys应当是封装的sendmessages
作者: Nothing    时间: 2006-11-28 11:01

是SendMessage
你可以参考MSDN中的WM_KEYUP
其实中文只是连继发送了两个ASCII
作者: Nothing    时间: 2006-11-28 11:02

还有一个办法,你将中文放到粘贴板,然后发送Ctrl+V
作者: 只爱陌生人    时间: 2006-11-28 19:54

谢谢。
不过,如果放在粘贴板上,发生变化之后,就不是当时想发送的字符了。

另外,如果字符串不是固定的,而是由用户随时变更的,这样一来,如果要发送中文的话,就得知道每一个要发送的中文的两个ASCII码,这不好办吧。
作者: 只爱陌生人    时间: 2006-11-28 20:16

在网上找到一篇文章,觉得可行。请版主看一下,有没更好的。
‘======================================
发送中文我用

strSend = StrConv(strSend, vbFromUnicode)
for i=1 to lenb(strSend)
SendMessage lngHwnd, WM_CHAR, AscB(MidB(strSend, iPos2, 1)), 0
next

但是好象会多了一个空格
不用转换成 ASCII 码直接发送也会产生类似的错误

发送 回车 我这样做

SendMessage lngHwnd, WM_KEYDOWN, VK_RETURN, 0

可是并没有如想象一样,目标文本框(多行)会产生一个回车
忘高手指教
’=================回贴如下:
用PostMessage 发送.

Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


strSend = StrConv(strSend, vbFromUnicode)
for i=1 to lenb(strSend)
PostMessage lngHwnd, WM_CHAR, AscB(MidB(strSend, iPos2, 1)), 0

‘发送回车
PostMessage lngHwnd, WM_CHAR, AscB(vbCrLf), 0
作者: 只爱陌生人    时间: 2006-11-28 20:30

附另一篇:

Option Explicit

Private Const WM_SETTEXT = &HC

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 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long

Private Sub Command1_Click()
Dim s As String
Dim FT_hWnd As Long
Dim ID_Control_hWnd As Long

s = "test" & vbCrLf & "测试"

FT_hWnd = FindWindow("Notepad", vbNullString)
If FT_hWnd = 0 Then
MsgBox "False", vbInformation, "Title"
End
End If

ID_Control_hWnd = GetDlgItem(FT_hWnd, &HF)
SendMessage ID_Control_hWnd, WM_SETTEXT, 0, ByVal s
End Sub

当用SendMessage发送WM_SETTEXT消息时,wParam未使用,所以填0即可,没必要写成LenB(StrConv(s, vbFromUnicode))这么复杂,lParam参数才是需要设置的文本信息。
你一定知道VB中字符串是用Unicode形式存放的,所以你想把它转成ANSI字符串,wParam参数才写成LenB(StrConv(s, vbFromUnicode))这么复杂,但最重要的lParam参数确没对字符串s做任何处理。注意从VB的API Viewer中复制出来的SendMessage的lParam参数是"lParam As Any",所以你在这个参数上直接写s是把s字符串的地址传给了lParam,而且传入的这个地址还是VarPtr(s)而不是StrPtr(s),其实在VB中,对字符串只需要"ByVal 字符串名"就能将Unicode字符串转成ANSI字符串并将字符串指针传递过去,所以我在lParam参数上只用了"ByVal s"就可以解决问题。

我这段代码是针对记事本程序的,你再改成你的对应窗体就可以了。

PS:原贴地址:http://zhidao.baidu.com/question/15922107.html
作者: Nothing    时间: 2006-11-29 09:06

WM_SETTEXT和WM_CHAR不等于模拟键盘事件,他们相当于设置文本框内容,即Text1.text="内容"。
所以需要模拟键盘事件就需要发送键盘消息。一般是键盘放开的事件,如:
SendMessage lngHwnd, WM_KEYUP, VK_RETURN, 0
作者: Nothing    时间: 2006-11-29 09:10

SendKeys 不能实现一些特殊的键, 如 Alt+PrintScr 。 不过使用 API ,可以改变这样的状况。
声明:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
使用:
' 一个抓屏的例子
Const VK_SNAPSHOT As Byte = &H2C
' 把应用窗口图象放到剪贴板:
Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
' 把整个屏幕抓到剪贴板:
Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
可以用该方法抓 AVI 图象。




欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/) Powered by Discuz! 6.0.0