2011-07-24 26 views
8

Bàn phím ảo trong Windows 7 sẽ cho phép bạn tập trung vào hộp văn bản trong khi bạn nhập bằng bàn phím. Trong C# và .Net, làm thế nào tôi có thể buộc một ứng dụng khác giữ lại tiêu điểm trong khi chấp nhận đầu vào giống như bàn phím trên màn hình Win7? Hoặc có lẽ một cách tốt hơn để nói nó, làm thế nào tôi có thể không có ứng dụng của tôi tập trung khi tương tác với?Không tập trung, nhưng cho phép tương tác?

Tôi đã thử LockSetForegroundWindow và không thấy kết quả nào với nó.

+0

WinForms hoặc WPF? – BoltClock

+0

WPF tốt hơn. –

Trả lời

14

Bạn phải đặt kiểu mở rộng WS_EX_NOACTIVATE trên cửa sổ của mình. Cách dễ nhất là sử dụng 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(); 

Bạn cũng có thể sử dụng lớp interop WPF HwndSource để tạo cửa sổ. Hàm khởi tạo của nó chấp nhận kiểu cửa sổ mở rộng.

+0

Tôi đang làm việc ngay bây giờ và không thể thử điều này, nhưng tôi rất vui mừng về một giải pháp đơn giản như thế này. Khi tôi về đến nhà, tôi sẽ ném nó vào và báo cáo lại nó như thế nào. –

+2

Hoạt động đáng kinh ngạc. –

+0

Chỉ cần lưu ý rằng nếu cửa sổ sẽ có mối quan hệ cha mẹ \ chủ sở hữu với bất kỳ cửa sổ khác hơn cờ này WS_EX_NOACTIVATE sẽ bị bỏ qua. – Evgeny

Các vấn đề liên quan