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

我已经创build了一个屏幕保护程序(C#.NET 4.0如果重要的话),但我有一些问题(在一个更美观的水平,虽然)。 这些可能很容易解决,但是我有很多从未使用过的Win32 API,所以我可以很容易地忽略这个问题。

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

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

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

Q2:如果我按照“常用的方式”创build表单,即打开configuration对话框

  Application.Run(new ConfigurationForm()); 

该对话框将不会是控制面板小程序的模式。 这怎么能实现? 我已经了解到,父母的HWND提供了命令参数为“/ c:nnnnnnnn”,但这是我得到的。 (使用SetParent(hwndParent)只是performance怪异,所以显然不是正确的function。)

Solutions Collecting From Web of ".NET:屏幕保护程序configuration对话框所有者和预览焦点"

你不检查你的API调用的返回值…我知道,我也从CodeProject“借”了这个代码,并且它在XP以前的任何Windows中都被破坏了。

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

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

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