c# - 不聚焦,但允许互动?

标签 c# .net wpf

Windows 7 中的屏幕键盘可让您在使用键盘键入时将注意力集中在文本框上。在 C# 和 .Net 中,如何强制另一个应用程序在接受输入时保持焦点,就像 Win7 屏幕键盘一样?或者也许更好的表达方式是,我怎么能不让我的应用程序在与之交互时集中注意力?

我试过了LockSetForegroundWindow并且没有看到任何结果。

最佳答案

您必须设置 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创建你的窗口。它的构造函数接受扩展窗口样式。

关于c# - 不聚焦,但允许互动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6804251/

相关文章:

c# - 将项目更新到实体核心 5 后出现 Microsoft.EntityFrameworkCore.Query.IParameterValues 错误

c# - 使用基类并拥有从其继承的类

c# - 如何高效地创建和使用 builder 模式

c# - float 的乘法性能不一致

c# - 无法删除该对象,因为在 ObjectStateManager 中找不到它

wpf - 带有附加属性的模板绑定(bind)

wpf - 将 wpf 文本 block 滚动到末尾

c# - 不使用扩展方法选择 XML 元素

c# - WPF 自定义布局/虚拟化

c# - 查找 .Intersect .Count > 阈值情况的快捷方式?