2011-07-24 40 views
8

Windows 7中的屏幕鍵盤可讓您在使用鍵盤進行鍵入時將注意力集中在文本框上。在C#和.Net中,我如何強制另一個應用程序在接受輸入時保持焦點,就像Win7屏幕鍵盤一樣?或者,也許更好的方式來說出它,我怎麼能不讓我的應用程序與交互時的焦點?不重視,但允許互動?

我試過LockSetForegroundWindow並沒有看到任何結果。

+0

WinForms或WPF? – BoltClock

+0

WPF最好。 –

回答

14

您必須在窗口上設置WS_EX_NOACTIVATE擴展樣式。最簡單的方法是使用P/Invoke。

private const int WS_EX_NOACTIVATE = 0x08000000; 
private const int GWL_EXSTYLE = -20; 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern int GetWindowLong(IntPtr hwnd, int index); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); 

... 

var window = new Window(); 
window.SourceInitialized += (s, e) => { 
    var interopHelper = new WindowInteropHelper(window); 
    int exStyle = GetWindowLong(interopHelper.Handle, GWL_EXSTYLE); 
    SetWindowLong(interopHelper.Handle, GWL_EXSTYLE, exStyle | WS_EX_NOACTIVATE); 
}; 
window.Show(); 

您還可以使用WPF互操作類HwndSource來創建您的窗口。它的構造函數接受擴展的窗口樣式。

+0

我現在在工作,不能嘗試這個,但我對這樣一個簡單的解決方案感到非常興奮。當我回到家時,我會把它扔進去並報告它是如何發生的。 –

+2

令人驚歎。 –

+0

請注意,如果窗口將與其他任何窗口之間的父\所有者關聯,則此標誌WS_EX_NOACTIVATE將被忽略。 – Evgeny

相關問題