2010-01-10 42 views
2

我想從我的C#程序發送擊鍵到Java應用程序從C#應用程序發送鍵擊到Java應用程序 - 奇怪的行爲?

代碼爲sendig鍵是:

private void SendKeysToWindow(string WindowName, string KeysToSend) 
    { 
     IntPtr hWnd = FindWindow(null, WindowName); 
     ShowWindowAsync(hWnd, SW_SHOWNORMAL); 
     SetForegroundWindow(hWnd); 
     SendKeys.Send(KeysToSend);    
    } 

此代碼工作正常使用的所有程序,除了與Java應用程序,我要控制。

例如,如果我創建一個按鈕與如下因素的代碼:

SendKeysToWindow("Java application window name", "{F2}"); 
SendKeysToWindow("Popoup window name", "123"); 

此發送F2到主程序窗口,在這裏另一窗口彈出,並且第二SendKeysToWindow命令發送「123」到那個窗口。 這是預期的工作方式,所有其他程序都是如此。

但是,當我將這些命令發送到Java程序時,會發生以下情況:第一個SendKeysToWindow命令執行正常(彈出窗口出現),但不會將「123」發送到該窗口。

如果再次按下該按鈕,「123」被髮送到彈出窗口,並且它打開另一個popoup窗口。

如果我爲兩個SendKeysToWindow命令創建了兩個單獨的按鈕,並且一個接一個地按下它們,那麼這兩個命令都可以正常執行。

什麼是探針?

感謝advanvce的幫助,這真的讓我發瘋。

P.S .:我是C#的初學者,所以請保持簡單的答案。

+0

我猜,因爲你混合同步和異步調用。嘗試'ShowWindow'而不是'ShowWindowAsync'。 – 2010-01-10 21:42:00

+0

我嘗試使用ShowWindow而不是ShowWindowAsync。它仍然無法按預期運行,但行爲發生了一些變化:第一次點擊時,彈出式窗口出現,但「123」仍未發送給它。但是,如果我再次點擊該按鈕,第二個彈出窗口就會出現,「123」貼在正確的位置! - 至少我們有點接近.. – 2010-01-11 12:32:47

回答

1

一些試驗和錯誤後,下面的代碼似乎很好地工作:

private void SendKeysToWindow(string WindowName, string KeysToSend) 
    { 
     IntPtr hWnd = FindWindow(null, WindowName);    
     ShowWindow(hWnd, SW_SHOWNORMAL); 
     SetForegroundWindow(hWnd); 
     Thread.Sleep(50); 
     SendKeys.SendWait(KeysToSend);   
    } 
0

聽起來好像在發送{f2}和打開彈出窗口的Java應用程序之間可能只是有一段延遲。

您是否嘗試過檢查FindWindow是成功還是失敗?

+0

當我第二次點擊按鈕時,它立即將「123」寫入第一個彈出窗口。我甚至無法看到它,因爲第二個彈出窗口會立即隱藏它,所以延遲不能比在Windows程序中多得多。 我試圖在兩個SendKeysToWindow命令之間添加一個Thread.Sleep,但沒有成功。 我會嘗試ShowWindow而不是ShowWindowAsync並檢查FindWindow成功。 如何使用SendWait而不是發送? – 2010-01-10 22:33:08

相關問題