【问题标题】:Taking control of another application with sendkeys or window’s API is not working使用 sendkeys 或窗口的 API 控制另一个应用程序不起作用
【发布时间】:2011-11-18 15:50:27
【问题描述】:

我试图控制另一个应用程序来自动化我们每天执行 100 次的流程。这很简单,几个按键就够了,但我在所有尝试中都被挫败了。

第一轮: 我试过 .Net SendKeys 发送一个 alt+c: AppActivate("Multichannel Order Manager") '关注我希望控制的应用程序

THEN: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++ 试图解决这个问题,但不知道我做错了什么。

第三轮: 使用 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,这就是我想要完成的。所以第四轮采用了鼠标点击的方式。我尝试将鼠标位置移动到我试图将焦点移动到的文本框的已知位置,然后单击。

    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 尝试之间的差异相同。我能做什么或尝试不同的。任何建议表示赞赏。我认为如果我能获得主应用程序的子窗口的句柄,我的部分问题可能会得到解决,但我无法缝合,我不确定我做错了什么。

作为测试,我下载了一个免费的鼠标/按键宏记录器。它未能控制窗户比我更糟。

【问题讨论】:

    标签: .net vb.net mouseevent sendmessage sendkeys


    【解决方案1】:

    2,3 - Alt 和 Ctrl 的问题是应用程序检查键盘状态以了解它们是否被按下,而不是事件队列。这就是SendMessage 不起作用的原因。 keybd_event 虽然已弃用,但仍有效(应使用 SendKeys/SendInput 代替 :)

    1 - 你没有错过配置吗(根据Is there any difference between keybd_event() and SendKeys.SendWait()?);而且 FindWindow()/SetForegroundWindow() 可能比 AppActivate 更好用?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多