gpt4 book ai didi

.NET:屏幕保护程序配置对话框所有者和预览焦点

转载 作者:可可西里 更新时间:2023-11-01 10:51:00 25 4
gpt4 key购买 nike

我已经创建了一个屏幕保护程序(C#、.NET 4.0,如果重要的话),但我有几个问题(虽然在更美观的层面上)。这些问题可能很容易解决,但我一直觉得自己从未使用过 Win32 API,因此当涉及到这一点时,我很容易忽略明显的问题。

Q1:我是这样设置小预览窗口的:

SetParent(Handle, hwndParent);SetWindowLong(Handle, GWL_STYLE, new IntPtr(GetWindowLong(Handle, GWL_STYLE) | WS_CHILD));Rectangle parentRect;GetClientRect(hwndParent, out ParentRect);Size = parentRect.Size;  

其中 hwndParent 是从第二个命令参数中解析出来的。这里的问题是预览窗口从屏幕保护程序设置选项卡中窃取了焦点。作为天真的尝试,我调用了 SetFocus(hwndParent) 但没有任何效果。将焦点保持在应有位置的正确方法是什么

Q2:如果我以创建表单的“通常方式”打开配置对话框,即

Application.Run(new ConfigurationForm());

对话框将不是控制面板小程序的模态。如何实现?我已经了解预期父级的 HWND 随命令参数一起提供为“/c:nnnnnnnn”,但就我所知就是这样。 (使用 SetParent(hwndParent) 只是表现得很奇怪,所以它显然不是正确的函数。)

最佳答案

您没有检查 API 调用的返回值...我知道,我也从 CodeProject“借用”了该代码,并且它在 XP 之后的任何 Windows 中都被破坏了。

您对 SetWindowsLong 的调用失败了,因为一旦您更改了窗口的父级,您就无法再更改它。如果您检查返回值并使用 GetLastError,您会看到 GetWindowLong 和 SetWindowLong 失败,错误 = 5(访问被拒绝)。

我通过将对 SetParent 的调用移动到使窗口成为子窗口的调用之后来修复此问题。在这个问题中查看我的代码:Why won't the screen saver control panel kill my form when it dies?

你很快也会问我在那里问的问题:-)

关于.NET:屏幕保护程序配置对话框所有者和预览焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484899/

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