我试图控制另一个应用程序来自动化我们每天做100次的过程。这很简单,只有几个关键的笔触,但我在所有尝试中都被挫败了。
第1轮: 我试过.Net SendKeys发送一个alt + c: AppActivate(“多渠道订单管理器”)'专注于我希望控制的应用程序
然后:SendKeys.SendWait('%C')或SendKeys.Send('%C')或SendKeys.SendWait('%c')或SendKeys.Send('%c')都没有发生任何事情在我的应用程序中 如果我发送alt然后发送'c'应用程序响应但不响应组合。当我单独发送它们时,应用程序不能满足我的需求,它们必须在一起。所有alt键组合都会失败,但单击键可以正常工作。
第2轮: 我尝试使用FindWindow和PostMessage API发送击键:
Dim ParenthWnd As New IntPtr(0)
Dim hWnd As New IntPtr(0)
Dim iRetval As Integer
ParenthWnd = FindWindowByClass("momwin9c000000", 0)
If ParenthWnd.Equals(IntPtr.Zero) Then
Beep()
Else
iRetval = SendMessage(ParenthWnd, WM_KEYDOWN, Keys.Alt, 0)
iRetval = SendMessage(ParenthWnd, WM_KEYUP, Keys.C, 0)
iRetval = PostMessage(ParenthWnd, WM_KEYUP, Keys.Alt, 0)
End If
这也失败了,也许是因为我没有写到应用程序的正确子窗口?我曾尝试使用Spy ++试图解决这个问题,但不知道我做错了什么。
第3轮: 使用Spy ++我试图弄清楚我应该发送什么命令,但是我可能还不完全理解我应该做什么。
Dim ParenthWnd As New IntPtr(0)
Dim hWnd As New IntPtr(0)
Dim iRetval As Integer
ParenthWnd = FindWindowByClass("momwin9c000000", 0)
If ParenthWnd.Equals(IntPtr.Zero) Then
Beep()
Else
' Have the window handle
Dim ChildhWnd As New IntPtr(0)
ChildhWnd = FindWindowEx(ParenthWnd, IntPtr.Zero, "momwin9c000000", "MOM Main Menu Toolbar")
If ChildhWnd.Equals(IntPtr.Zero) = False Then
iRetval = PostMessage(ParenthWnd, WM_KEYUP, &H12, &HD0380001)
iRetval = PostMessage(ChildhWnd, WM_KEYUP, Keys.ShiftKey, 0)
iRetval = PostMessage(ChildhWnd, WM_KEYUP, Keys.Alt, 0)
End If
End If
第4轮: 关于我没有提到的事情是应用程序窗口分为2个面板。我不能从一个面板到另一个面板,但我可以(使用键盘)alt + c,这是我想要完成的。所以第4轮进入鼠标点击方法。我尝试将鼠标位置移动到我想要移动焦点的文本框的已知位置,然后单击。
Cursor.Position = Me.PointToScreen(New Point(200, 180))
mouse_event(MOUSEEVENTF_LEFTDOWN, 200, 180, 0, 0)
这会将鼠标指针移动到底部面板中文本框的中心并单击,但是,焦点会保留在顶部面板中,并且只会移动到下一个文本框,几乎就像一个tabkey笔划。
内容: 我不明白实际的alt + c键击与sendkeys版本或Window的API版本之间有什么区别,但真正的键击工作和我的尝试失败。与实际鼠标点击和我的mouse_event api尝试之间的差异相同。我能做什么或尝试不同。任何建议表示赞赏。我认为如果我可以获得主应用程序的子窗口的句柄,我的部分问题可能会得到解决,但是我无法找到并且我不确定我做错了什么。
作为测试,我下载了一个免费的鼠标/按键宏录像机。它无法控制窗口比我差。
答案 0 :(得分:0)
2,3 - Alt和Ctrl的问题是应用程序检查键盘状态以确定它们是否被按下,而不是事件队列。这就是为什么SendMessage
不起作用的原因。 keybd_event
虽然已被弃用(但应使用SendKeys / SendInput代替:),但仍有效。
1 - 你没有错过配置(根据Is there any difference between keybd_event() and SendKeys.SendWait()?);而且FindWindow()/ SetForegroundWindow()可能比AppActivate效果更好吗?