使用sendkeys或window的API控制另一个应用程序不起作用

时间:2011-11-18 15:50:28

标签: .net vb.net mouseevent sendmessage sendkeys

我试图控制另一个应用程序来自动化我们每天做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尝试之间的差异相同。我能做什么或尝试不同。任何建议表示赞赏。我认为如果我可以获得主应用程序的子窗口的句柄,我的部分问题可能会得到解决,但是我无法找到并且我不确定我做错了什么。

作为测试,我下载了一个免费的鼠标/按键宏录像机。它无法控制窗口比我差。

1 个答案:

答案 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效果更好吗?