2012-02-09 52 views
0

我想發送像「a」這樣的按鍵,而不是像我的應用程序中的按鍵Shift鍵,這就像屏幕鍵盤。我用這個代碼,但它不工作:將密鑰發送到非活動窗口?

IntPtr p = FindWindow(null, <myWindowTitle>); 
ShowWindow(GetWindow(p, 3), 5); 
SendKeys.SendWait("a"); 

但仍然我不能發送密鑰到以前的窗口!

回答

2

你所描述的實際上並不像屏幕鍵盤。它將按鍵發送到活動的窗口。請注意,OSK永遠不會收到輸入焦點,這完全是由設計決定的。

SendKeys只發送輸入到活動窗口。在Windows UI模型中,這是唯一可以接收鍵盤/鼠標輸入的窗口。首先,「積極」/「聚焦」窗口的區別就在於這一點。

很難爲您的問題提出一個替代解決方案,而無法準確知道您要完成的任務。一些想法:

  • 沒有理由重新實現OSK;它與所有版本的Windows捆綁在一起,所以你可以簡單地使用Process.Start來啓動它,並確保所有的都可以正常工作。

  • 如果需要做這樣的事情你自己,看看抄襲其設計,防止您的輸入窗口從不斷接收焦點。這將強制接收鍵盤事件的窗口保持焦點並允許它接收該輸入。

  • 或者,您可以調用SetForegroundWindow function來激活用於接收鍵盤輸入的窗口,但我不建議這樣做。

+0

是的正是我正在製作一個屏幕鍵盤,所以我想發送按鍵到非活動窗口,如果我的應用程序最小化將被激活。我應該怎麼做? Process.Start與此問題無關,並且SetForegroundWindow函數僅使其更難,因爲使用GetWindow更簡單一些。謝謝 – Peyman 2012-02-09 09:57:16

+0

@Peyman:'Process.Start'是這個世界上最相關的東西。你正在尋找的代碼是'Process.Start(「osk.exe」)'。正如我所提到的,Windows包括所有版本的屏幕鍵盤應用程序。你可以依靠它在那裏,並依靠它工作。不要重新發明輪子。你的評論只是重申了問題所在;我已經解釋了爲什麼這不起作用。 – 2012-02-09 17:26:03

+0

抱歉,但我真的不知道我應該怎麼做才能將鍵發送到上一個活動窗口,讓我們想要精確地開發一個屏幕上的鍵盤。如何Process.Start(「osk.exe」);可以幫助我做到這一點? – Peyman 2012-02-09 18:04:41