使用我在 CodeProject 上找到的代码,我创建了一个屏幕保护程序。下面的表单是当用户选择我的屏幕保护程序时我在控制面板中显示的一个很小的表单。
一切似乎都运行良好;表单在控制面板的正确位置正确调整大小并绘制(它是空白的),随着 CP 移动等。但是当控制面板关闭(或用另一个屏幕保护程序的迷你预览替换我的表单)时,我的应用程序不会死。它只是挂在记忆中。
我的表单没有收到表单关闭/关闭消息或可见性更改等。我在这里没有正确设置父母身份吗?
这是相关的代码。所有导入的 WinAPI 调用都返回预期值,而 GetLastError 总是返回零,所以我认为这不是问题......
private void miniControlPanelForm_Load(object sender, EventArgs e)
{
// note that iphWnd is a class variable, passed to us by windows
// set our window style to WS_CHILD, so that our window is
// destroyed when parent window is destroyed.
// get the current window style, but with WS_CHILD set
IntPtr ip = new IntPtr();
int index = (int)NativeMethods.WindowLongFlags.GWL_STYLE | 0x40000000;
ip = NativeMethods.GetWindowLongPtr(this.Handle, index);
int error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
// set that value as our current Style
object ohRef = new object();
HandleRef hRef = new HandleRef(ohRef, this.Handle);
IntPtr ip2 = new IntPtr();
int index2 = (int)NativeMethods.WindowLongFlags.GWL_STYLE;
ip2 = NativeMethods.SetWindowLongPtr(hRef, index2, ip);
error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
// set the passed preview window as the parent of this window
IntPtr newOldParent = NativeMethods.SetParent(this.Handle, iphWnd);
error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
//set our window's size to the size of our window's new parent
Rectangle ParentRect = new Rectangle();
NativeMethods.GetClientRect(iphWnd, ref ParentRect);
this.Size = ParentRect.Size;
//set our location at (0, 0)
this.Location = new Point(0, 0);
}
我在各种“表单正在关闭”事件处理程序中有 Application.Exit,但它们从未被调用...