2010-06-09 29 views
5

我想喲使用SendMessagePostMessage在另一個應用程序在另一個應用程序

我有一個示例代碼通過獲取窗口句柄做到這一點按下一個按鈕,點擊按鈕,但它不工作

我還使用「WinDowse」獲取所需的信息。這裏是代碼

private const uint BM_CLICK = 0x00F5; 
private const uint WM_LBUTTONDOWN = 0x0201; 
private const uint WM_LBUTTONUP = 0x0202; 

private void PushOKButton(IntPtr ptrWindow) 
{ 
    WindowHandle = FindWindow(null, "Form1"); 
    if (ptrWindow == IntPtr.Zero) 
     return; 

    IntPtr ptrOKButton = FindWindowEx(ptrWindow, IntPtr.Zero, "Button", "&Yes"); 

    if (ptrOKButton == IntPtr.Zero) 
     return; 

    SendMessage(ptrOKButton, WM_LBUTTONDOWN, 0, 0); 
    SendMessage(ptrOKButton, WM_LBUTTONUP, 0, 0); 
    SendMessage(ptrOKButton, BM_CLICK, 0, 0); 
} 

是否有在C#Compelete Suloution?

回答

0

您有正確的概念。 自動化總是有一些技巧。

按鈕向下/向上靠近原始點擊動作,但不完全相同。 你將要考慮

  1. ,你點擊COORDS - 某些按鈕並不在鼠標的0,0
  2. 位置喜歡邊點擊 - 按鈕的鼠標外,在開始或結束可能會導致它到不行
  3. 時間點擊 - 有時一個快速點擊將被忽略,添加的說10毫秒

BM_CLICK是做一個按鈕,用鼠標點擊時要發送一個額外的Win32消息的小的延遲 - 它是如果控件是適合使用的類型,則方法更簡單並且更容易一個人。

一些努力是爲了防止像使用WM_GetText從外國應用程序的密碼編輯的東西,要警惕,你可能也有問題,取決於目標應用程序。

不幸的是,我現在沒有C#示例代碼。

也許你可以看看AutoIT來節省一些時間。

+0

*「你有正確的總體想法。」* - 嗯,不。這個想法是錯誤的。消息只是輸入處理的可觀察部分。如果您只重播那部分內容,那麼您會以不一致的狀態結束。真正的答案是[UI自動化](https://msdn.microsoft.com/en-us/library/ms747327.aspx)。 – IInspectable 2016-07-13 17:13:09

+0

.Net用戶界面自動化框架是有限的,並且會導致各種人爲因素 - 例如Adobe Reader提示可訪問性模式,如果您甚至將其顯示的窗口放在側面。 由於自定義控件創建未正確覆蓋自動化支持的目標應用程序中的錯誤,我們一直在崩潰許多試圖使用UI自動化的Microsoft應用程序。 – 2016-07-14 05:50:55

+0

如果預構建的庫支持不足,則UI自動化通過COM對象公開,這些對象很容易從.NET中使用。你的評論表明你回答了一個不同的問題:*「假設UI自動化不適合我們,有什麼替代方案?」OP從未聲稱UI自動化不適合他們,所以應該首先考慮它。如果你需要僞造輸入,你確實需要做的正確。發送消息不會(請參閱[重放輸入與重新處理它不同](https://blogs.msdn.microsoft.com/oldnewthing/20121206-00/?p=5903))。 – IInspectable 2016-07-14 09:14:13

-1

以下是使用win32 API驅動鼠標的示例 - 實際用於拖放區域的選擇,但您可以將按鈕上下移動鼠標的方式更改爲鼠標。

POINT p; 
BOOL cursorPosGetSuccessful = GetCursorPos(&p); 
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, horA, verA, NULL, 0); 
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, NULL, 0); 
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, horB, verB, NULL, 0); 
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, NULL, 0); 
if (cursorPosGetSuccessful)// put the mouse back to roughly where it used to be before the scan. 
    mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, p.x, p.y, NULL, 0); 
+0

假設我有這些:鼠標座標,窗口標題,窗口句柄,窗口類名稱,你可以留下一個完整的代碼? – sam 2010-06-09 21:11:15

+0

直接從[mouse_event](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646260.aspx):*「該函數已被取代。使用[SendInput](https:// msdn .microsoft.com/en-us/library/windows/desktop/ms646310.aspx)。「*兩者都不允許您控制特定的進程;輸入總是進入前臺進程。正如您在其他答案中所指出的那樣(爲什麼您覺得迫切需要發佈兩個?):真正的答案是[UI自動化](https://msdn.microsoft.com/en-us/library/ms747327.aspx) 。 – IInspectable 2016-07-13 17:17:16

+0

感謝您的更新。第二篇文章是由於不同的可能答案。 – 2016-07-14 05:48:13

相關問題