2009/12/13

C#でフォームをアクティブにせずに開く方法

.net frameworkで、ポップアップウィンドウを作ろうとすると、
いろいろ面倒な罠がありました。

まず、アクティブにせずにフォームを開く必要があり、
ShowWithoutActivationというプロパティを変更するとよさそうなのですが、
読み取り専用なので、値を変更できない。

すると、このプロパティをoverrideするしかないのですが、

MSDNによると、
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.showwithoutactivation(VS.80).aspx

> フォーム内で ShowWithoutActivation をオーバーライドし、
> true が返されるようにプログラミングしても、値を変更することはできません。


なんだよー。と思いつつ調べてると、
http://d.hatena.ne.jp/masa-k/20080609/1213015216
こいつはどうも誤訳で、
> このプロパティはread-onlyなので、変えたいときは
> ShowWindowActivationをoverrideしてtrueを返すようにしてください。
が、正しいよう。

で、なんだーできるんじゃないですかー。と思いつつ試していると、
何故かできない。

で、結局原因は、
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=401311
「TopMostプロパティをtrueにしているとShowWindowActivationが効かない」
というバグのせいのよう。

ポップアップに使うにはTopMostが効いてないといろいろ不便なので、
結局、ここの下のほうにあるように
http://www.r-nakai.com/archives/99
SetWindowPos APIを使うしかないよう。
(つうかC#でWIN32 APIって使っていいんだ・・・。)

ただ、これをやるとLoadとかのイベントが発生しないようなので、
そこらへんは手で実装してやる必要があるようです。


.net Framework3.5で確認。

0 件のコメント: