我的應用程序使用SendKeys
導航並將數據輸入到輸入字段(我知道這不是最好的方法,但我必須使用這個限制)。現在,我想確保當SendKeys
正常工作時正確的窗口處於活動狀態。當應用程序正在運行時,如何同時檢查哪個是活動窗口?
確認此問題的一種方法是在每個SendKeys
命令前檢查當前活動窗口。但這聽起來非常詳盡?有一個更好的方法嗎?我不知道多少,但我正在猜測使用多線程?有任何想法嗎?
我的應用程序使用SendKeys
導航並將數據輸入到輸入字段(我知道這不是最好的方法,但我必須使用這個限制)。現在,我想確保當SendKeys
正常工作時正確的窗口處於活動狀態。當應用程序正在運行時,如何同時檢查哪個是活動窗口?
確認此問題的一種方法是在每個SendKeys
命令前檢查當前活動窗口。但這聽起來非常詳盡?有一個更好的方法嗎?我不知道多少,但我正在猜測使用多線程?有任何想法嗎?
據我所知,從你的帖子你發送消息到不屬於你的應用程序的窗口。如果是這樣,那麼恐怕你必須在每次SendKeys呼叫之前檢查活動窗口。
是的,我必須將消息發送到不屬於我的應用程序的窗口。 – pavanred 2009-12-21 19:09:55
我想你必須在調用SendKeys之前檢查是否有焦點,或者使用OnGotFocus和OnLostFocus跟蹤自己關注的焦點。多線程不會幫助你,只有GUI線程可以與GUI進行交互。所以你可以有一個後臺線程做工作,但它必須委派任何與GUI的交互。您可以通過在任何控件或窗口上調用BeginInvoke來執行此操作,並且它將以正確的線程運行代理。
編輯:哦。我錯過了你沒有「擁有」有問題的窗口。下面的代碼將不起作用。你需要繼續做你正在做的事情。您可以在每個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);
}
}
如果你有一個的repetetive任務,做一個函數出來的......
警告 :剛剛編碼,沒有任何檢查功能調用的正確性等。
void MySendKeyFunc(string windowTitle, IEnumerable<Keys> keys)
{
if(!GetForegroundWindow(windowTitle)
{
SetForegroundWindow(windowTitle);
}
foreach(Key key in keys)
{
SendKeys(key);
}
}
你爲什麼認爲checki ng活動窗口是詳盡的?這是由儀器證實,一次調用GetForegroundWindow殺死性能? – 2009-12-22 00:45:05
不,我沒有通過儀器確認。我只是想在每個SendKeys命令重複之前調用GetForegroundWIndows。這實際上也是我的問題的一部分 - 這是做這件事的好方法嗎? – pavanred 2009-12-22 05:01:35