2

我创建了一个屏幕保护程序(C#、.NET 4.0,如果这很重要),但我有几个问题(不过,在更美观的层面上)。这些可能很容易解决,但我很可能从未使用过 Win32 API,所以当涉及到这一点时,我很容易错过显而易见的事情。

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

SetParent(句柄,hwndParent);
SetWindowLong(Handle, GWL_STYLE, new IntPtr(GetWindowLong(Handle, GWL_STYLE) | WS_CHILD));
矩形父矩形;
GetClientRect(hwndParent, out ParentRect);
尺寸 = 父矩形尺寸;  

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

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

Application.Run(新的 ConfigurationForm());

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

4

1 回答 1

0

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

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

我通过将调用 SetParent 移动到调用后使 Window 成为子窗口来解决此问题。在这个问题中查看我的代码: 为什么屏幕保护程序控制面板在它死时不会杀死我的表单?

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

于 2014-08-25T04:45:40.000 回答