我已经创建了一个屏幕保护程序(c,.net 4.0,如果这很重要的话),但是我有几个问题(在更美观的层面上)。这些问题可能很容易解决,但我有很多没有使用过win32 api的prettu,所以我很容易忽略这一点。
问题1:我设置了一个小的预览窗口,如下所示:
setparent(句柄,hwndparent);
setwindowlong(handle,gwl_style,new intptr(getwindowlong(handle,gwl_style)ws_child));
矩形父矩形;
getclientrect(hwndparent,out parentrect);
size=parentrect.size;
其中hwndParent是从第二个命令参数解析的。这里的问题是预览窗口从屏幕保护程序设置选项卡中窃取焦点。作为一个天真的尝试,我打电话给了SetFocus(hwndParent),但没有任何效果。把焦点放在应该放的地方的正确方法是什么
问题2:如果我以创建表单的“常用方式”打开配置对话框,即
application.run(new configurationform());
该对话框将不是控制面板小程序的模式。如何才能做到这一点?我已经理解了目标父节点的hwnd被提供了命令参数“/c:nnnnnn”,但这是我所得到的。(使用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?
你很快就会问我在那里问的问题:-)

08-16 02:34