gpt4 book ai didi

c# - 在启动窗口中处理 WM_NCACTIVATE 会阻塞所有其他窗口

转载 作者:太空狗 更新时间:2023-10-29 23:23:27 27 4
gpt4 key购买 nike

我试图让一个特定的 WPF 窗口保持焦点,这意味着它在失去焦点时不应该改变窗口样式(例如像标准的 Windows 任务栏)。为此,我连接到 WndProc 以检查 WM_NCACTIVATEWM_ACTIVATE 是否设置为 false(wParam == 0 ),然后将消息标记为 handled = true; 以阻止窗口处于非事件状态。下面是一些示例代码:

void Window_Loaded(object sender, RoutedEventArgs e)
{
var source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
if (source != null) source.AddHook(WndProc);
}

private const uint WM_NCACTIVATE = 0x0086;
private const int WM_ACTIVATE = 0x0006;
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_NCACTIVATE)
{
if (wParam == new IntPtr(0))
handled = true;
}
if (msg == WM_ACTIVATE)
{

if (wParam == new IntPtr(0))
handled = true;
}
return IntPtr.Zero;
}

但是,通过这样做,从该主窗口中创建的所有其他 WPF 窗口

var f = new Window();
f.ShowDialog();

永远不会获得焦点,尽管它们是可见的,但窗口不会对客户区以及 Windows 最小化、最大化和关闭按钮的用户输入使用react。我显然做错了什么,那么关于如何以正确的方式做到这一点有什么建议或指示吗?

最佳答案

即使窗口失去焦点也能使 WPF 窗口的视觉样式保持事件状态的解决方案是像这样处理 WM_NCACTIVATE:

private const uint WM_NCACTIVATE = 0x0086;

private IntPtr WndProc(IntPtr hwnd, int msg,
IntPtr wParam, IntPtr lParam, ref bool handled)
{
var returnvalue = IntPtr.Zero;
if (msg == WM_NCACTIVATE)
{
//replace the wParam (true/false) which indicates
//active/inactive with always true
returnvalue = DefWindowProc(hwnd, WM_NCACTIVATE,
new IntPtr(1), new IntPtr(-1));
handled = true;
}
}


[DllImport("user32.dll")]
static extern IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages uMsg, IntPtr wParam, IntPtr lParam);

关于c# - 在启动窗口中处理 WM_NCACTIVATE 会阻塞所有其他窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17298150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com