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