2009-12-21 54 views
0

我的應用程序使用SendKeys導航並將數據輸入到輸入字段(我知道這不是最好的方法,但我必須使用這個限制)。現在,我想確保當SendKeys正常工作時正確的窗口處於活動狀態。當應用程序正在運行時,如何同時檢查哪個是活動窗口?

確認此問題的一種方法是在每個SendKeys命令前檢查當前活動窗口。但這聽起來非常詳盡?有一個更好的方法嗎?我不知道多少,但我正在猜測使用多線程?有任何想法嗎?

+0

你爲什麼認爲checki ng活動窗口是詳盡的?這是由儀器證實,一次調用GetForegroundWindow殺死性能? – 2009-12-22 00:45:05

+0

不,我沒有通過儀器確認。我只是想在每個SendKeys命令重複之前調用GetForegroundWIndows。這實際上也是我的問題的一部分 - 這是做這件事的好方法嗎? – pavanred 2009-12-22 05:01:35

回答

2

據我所知,從你的帖子你發送消息到不屬於你的應用程序的窗口。如果是這樣,那麼恐怕你必須在每次SendKeys呼叫之前檢查活動窗口。

+0

是的,我必須將消息發送到不屬於我的應用程序的窗口。 – pavanred 2009-12-21 19:09:55

0

我想你必須在調用SendKeys之前檢查是否有焦點,或者使用OnGotFocus和OnLostFocus跟蹤自己關注的焦點。多線程不會幫助你,只有GUI線程可以與GUI進行交互。所以你可以有一個後臺線程做工作,但它必須委派任何與GUI的交互。您可以通過在任何控件或窗口上調用BeginInvoke來執行此操作,並且它將以正確的線程運行代理。

0

編輯:哦。我錯過了你沒有「擁有」有問題的窗口。下面的代碼將不起作用。你需要繼續做你正在做的事情。您可以在每個sendkeys之前始終調用SetForegroundWindow。

讓使用SendKeys的類掛鉤有問題的表單中的Activated和Deactivated事件。

internal class SendKeysClass 
{ 
    private bool _canSend; 

    public SendKeysClass(Form form) 
    { 
     form.Activated += (sender, args) => _canSend = true; 
     form.Deactivate += (sender, args) => _canSend = false; 
    } 

    public void Send(string keys) 
    { 
     if (!_canSend) 
      return; 

     SendKeys.Send(keys); 
    } 
} 

或者,如果你不使用.net 3.5/C#3.0:

internal class SendKeysClass 
{ 
    private bool _canSend; 

    public SendKeysClass(Form form) 
    { 
     form.Activated += OnActivated; 
     form.Deactivate += OnDeactivated; 
    } 

    private void OnDeactivated(object sender, EventArgs e) 
    { 
     _canSend = false; 
    } 

    private void OnActivated(object sender, EventArgs e) 
    { 
     _canSend = true; 
    } 

    public void Send(string keys) 
    { 
     if (!_canSend) 
      return; 

     SendKeys.Send(keys); 
    } 
} 
0

如果你有一個的repetetive任務,做一個函數出來的......

警告 :剛剛編碼,沒有任何檢查功能調用的正確性等。

void MySendKeyFunc(string windowTitle, IEnumerable<Keys> keys) 
{ 
    if(!GetForegroundWindow(windowTitle) 
    { 
     SetForegroundWindow(windowTitle); 
    } 
    foreach(Key key in keys) 
    { 
     SendKeys(key); 
    } 
} 
相關問題