2011-07-24 21 views
8

Windows 7'deki ekran klavyesi, klavyeyi kullanarak yazarken bir metin kutusuna odaklanmanızı sağlayacaktır. C# ve .Net'te, Win7 ekran klavyesi gibi girdiyi kabul ederken başka bir uygulamayı odağı korumak için nasıl zorlayabilirim? Ya da belki de kelime için daha iyi bir yol, etkileşimde bulunduğumda uygulamamı nasıl odaklayabilirim?Odaklanma, ancak etkileşime izin vermiyor musunuz?

LockSetForegroundWindow'u denedim ve bununla hiçbir sonuç görmedim.

+0

WinForms veya WPF? Tercihen – BoltClock

+0

WPF. –

cevap

14

Pencerenize WS_EX_NOACTIVATE genişletilmiş stilini ayarlamanız gerekir. En kolay yol P/Invoke kullanmaktır.

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(); 

Ayrıca pencere oluşturmak için WPF birlikte çalışma sınıfını HwndSource kullanabilirsiniz. Yapıcısı genişletilmiş pencere stilini kabul eder.

+0

Şu anda işteyim ve bunu deneyemiyorum, ama bunun gibi basit bir çözümden dolayı çok heyecanlıyım. Eve döndüğümde, bunu fırlatacağım ve nasıl gittiğini bildireceğim. –

+2

Şaşırtıcı bir şekilde çalışır. –

+0

Yalnızca, pencerenin, bu bayrağın WS_EX_NOACTIVATE dışındaki herhangi bir penceresinin üst öğesiyle ilişkisi varsa, dikkate alınmayacağını unutmayın. – Evgeny

İlgili konular