Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Not take focus, but allow interaction?

Tags:

c#

.net

wpf

The onscreen keyboard in Windows 7 will let you keep focus on a textbox while you type using the keyboard. In C# and .Net, how can I force another application to retain focus while accepting input just like the Win7 onscreen keyboard? Or perhaps a better way to word it, how can I not have my app take focus when interacted with?

I have tried LockSetForegroundWindow and have seen no results with it.

like image 288
Corey Ogburn Avatar asked Jul 24 '11 00:07

Corey Ogburn


1 Answers

You have to set the WS_EX_NOACTIVATE extended style on your window. The easiest way is by using 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();

You can also use WPF interop class HwndSource to create your window. Its constructor accepts the extended window style.

like image 112
Julien Lebosquain Avatar answered Oct 20 '22 08:10

Julien Lebosquain