Outlookみたいな通知画面を出したかった
Outlookあるじゃないですか、あれって新着メールが来たら画面の右下にぴよっとポップアップというか、じわーっと表示される画面を出せますよね。あんなのを出したかった。
最前面に表示される、だがしかし、表示させるときには他のウィンドウのフォーカスを奪わない。Wordで文書を書いているときにフォーカス奪われたらたまったもんじゃない。
TopMost + ShowWithoutActivationじゃダメ
FormにはTopMostというプロパティがあり、こいつをtrueにすれば最前面表示される。また、ShowWithoutActivationというプロパティをオーバーライドしてtrueを返すようにすると、表示する際にアクティブにならない(他ウィンドウのフォーカスを奪わない)ので、これを組み合せれば良いはず。
ところが、TopMostをtrueにすると必ずアクティブになるようで、使えない。
SetWindowPosする
上記問題はTopMostプロパティを使わずに、SetWindowPosを呼べば解決できます。例えば、C#なら以下のメソッドを呼べばOK。
private void SetTopMost() { const int HWND_TOPMOST = -1; const uint SWP_NOSIZE = 0x0001; const uint SWP_NOMOVE = 0x0002; const uint SWP_NOACTIVATE = 0x0010; const uint SWP_SHOWWINDOW = 0x0040; const uint SWP_NOSENDCHANGING = 0x0400; // SetWindowPosはどこかでDllImportする SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_SHOWWINDOW); }
で、ShowWithoutActivation?をオーバーライドしtrueを返せば、所望の表示が可能。
参考サイト
参考というより、パクリ元と書くべきだな。