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

时间:2010-08-14 20:02:59

标签: .net windows screensaver

我已经创建了一个屏幕保护程序(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)只是表现得非常奇怪,所以它显然不是正确的功能。)

1 个答案:

答案 0 :(得分:0)

您没有检查API调用的返回值...我知道,我也是"借来的"来自CodeProject的代码,它在任何Windows XP中都被破坏了。

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

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

你很快就会问我问的问题: - )