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 がありますが、呼び出されることはありません...