请各位大老指教vb.net中调用api的( SendMessage)问题。

ruhong1 2020-03-20 09:07:43

Public Class Main
Const WM_KEYDOWN = 256
Const WM_KEYUP = 257
Public Const VK_NEXT = &H22
Dim p As New System.Diagnostics.Process
Dim bln_已加载 As Boolean
<DllImport("User32.dll ", EntryPoint:="SetParent")>
Private Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
End Function
<DllImport("user32.dll ", EntryPoint:="ShowWindow")>
Public Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer
End Function
Private Declare Auto Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer

Private Sub sbtn_裁入_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sbtn_裁入大智慧.Click
Dim inst As Process
Dim myProcess() As Process
myProcess = System.Diagnostics.Process.GetProcessesByName("wps")
If myProcess.Count = 0 Then
MsgBox("请先运行程序!", MsgBoxStyle.Information, "请注意")
Exit Sub
End If
For Each inst In myProcess
'If inst.Handle.ToInt32 = myExcel.Hinstance Then

p = System.Diagnostics.Process.GetProcessById(inst.Id)
System.Threading.Thread.Sleep(100)
SetParent(p.MainWindowHandle, pnl_11.Handle)
ShowWindow(p.MainWindowHandle, 3)
'End If
bln_已加载 = True
Next
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If bln_已加载 = True Then
SendMessage(p.Handle, WM_KEYDOWN, VK_NEXT, 0)
' System.Threading.Thread.Sleep(500)
SendMessage(p.Handle, WM_KEYUP, VK_NEXT, 0)
End If
End Sub
End Class


目的是找到指定软件,然后把他放到自己的frm中,再给这个软件发送消息SendMessage,让他翻页。现在是软件窗口找到了,也加到自己的窗口中了,就是发送消息给这个窗口,他没有反应,就是他不翻页,SendMessage 的参数也找不全,各位看看错在哪了。
...全文
271 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruhong1 2020-03-23
  • 打赏
  • 举报
回复
引用 2 楼 清晨曦月 的回复:
另,最后一个参数:

PostMessage(handle, WM_KEYDOWN, Keys.Space, MapVirtualKey(Keys.Space, WM_KEYDOWN))
MapVirtualKey是API,声明一下都用integer就可以了。
找到原因了,累死了,原来还要找到具体的控件才能发消息。
ruhong1 2020-03-21
  • 打赏
  • 举报
回复
引用 5 楼 清晨曦月 的回复:
WPS用什么翻页?你确定发送的按键对吗?
我知道了,可能直接发给主窗体SendMessage不行,是不是还要找到具体的子窗体或者控件的句柄? 大佬 ,给我一个枚举子窗体和控件的api 函数和实例,如果能有vb.net 的方法更好了。
清晨曦月 元老 2020-03-21
  • 打赏
  • 举报
回复
WPS用什么翻页?你确定发送的按键对吗?
ruhong1 2020-03-20
  • 打赏
  • 举报
回复
引用 2 楼 清晨曦月 的回复:
另,最后一个参数:

PostMessage(handle, WM_KEYDOWN, Keys.Space, MapVirtualKey(Keys.Space, WM_KEYDOWN))
MapVirtualKey是API,声明一下都用integer就可以了。
还是翻不了, 是不是翻之前,需要将那个窗口设置为焦点?
ruhong1 2020-03-20
  • 打赏
  • 举报
回复
引用 2 楼 清晨曦月 的回复:
另,最后一个参数:

PostMessage(handle, WM_KEYDOWN, Keys.Space, MapVirtualKey(Keys.Space, WM_KEYDOWN))
MapVirtualKey是API,声明一下都用integer就可以了。
谢谢,我看一下。
清晨曦月 元老 2020-03-20
  • 打赏
  • 举报
回复
另,最后一个参数:


PostMessage(handle, WM_KEYDOWN, Keys.Space, MapVirtualKey(Keys.Space, WM_KEYDOWN))
MapVirtualKey是API,声明一下都用integer就可以了。
清晨曦月 元老 2020-03-20
  • 打赏
  • 举报
回复
这个声明……感觉有点问题哈
另外确定vk_next翻页吗?记得这个家伙等于rbutton or space。。。
先改一下API试试吧:

<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function

附带一段调用代码你参考一下
Public Sub SendPaintMessage(ByVal handle As IntPtr)
SendMessage(handle, WM_PAINT, IntPtr.Zero, IntPtr.Zero)
End Sub

Public Sub SendMouseClick(ByVal handle As IntPtr, ByVal x As Integer, ByVal y As Integer)
If handle <> IntPtr.Zero Then
Dim lParam As IntPtr = New IntPtr((y << 16) Or x)
Dim wParam As IntPtr = IntPtr.Zero
SendMessage(handle, WM_LBUTTONDOWN, wParam, lParam)
Threading.Thread.Sleep(100)
My.Application.DoEvents()
SendMessage(handle, WM_LBUTTONUP, wParam, lParam)
End If
End Sub

Public Sub SpaceKeyDown(ByVal handle As IntPtr)
If handle <> IntPtr.Zero Then SendMessage(handle, WM_KEYDOWN, Keys.Space, IntPtr.Zero)
End Sub
Public Sub SpaceKeyUp(ByVal handle As IntPtr)
If handle <> IntPtr.Zero Then SendMessage(handle, WM_KeyUP, Keys.Space, IntPtr.Zero)
End Sub

Public Sub SendEnter(ByVal handle As IntPtr)
If handle <> IntPtr.Zero Then
SendMessage(handle, WM_KEYDOWN, Keys.Enter, IntPtr.Zero)
Threading.Thread.Sleep(10)
My.Application.DoEvents()
SendMessage(handle, WM_KeyUP, Keys.Enter, IntPtr.Zero)
End If
End Sub


16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧