6

以前、クリックスルー フォームを作成したいときに、プラットフォーム呼び出しを使用して拡張ウィンドウ スタイル( GetWindowLong/ SetWindowLongin user32.dll) を設定したくなりました。

ちょうど今、Alt+Tab ウィンドウ リストから見えないようにしたかったのですが、 /を使用する代わりに拡張ウィンドウ スタイルを設定するようにオーバーライドする例を見つけました。CreateParamsGetWindowLongSetWindowong

今私はこれを持っています:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x80000 /* WS_EX_LAYERED */ | 0x20 /* WS_EX_TRANSPARENT */ | 0x80/* WS_EX_TOOLWINDOW */;
        return cp;
    }
}

現在、明らかな変更により、プラットフォームの呼び出しは必要ありません。

だから私のいくつかの質問:

  1. Windows での機能上の違いはありますか? (私は今試す XP マシンさえ持っていません。)
  2. 現在、プラットフォームの呼び出しがありません。プログラムは Linux/Mac の Mono で実行されますか? (今試すことができれば、ここで質問することはありません。)
  3. Control.CreateParamsmsdnに表示され、ウィンドウ スタイルを操作する例があります。では、なぜオンラインの「例」と StackOverflow の回答でGetWindowLong/を使用するように指示されているのSetWindowLongでしょうか。
4

1 に答える 1

10

Windows での機能上の違いはありますか?

はい、とてもそうです。CreateParams をオーバーライドすると、ウィンドウが CreateWindowEx() 呼び出しで作成されるときに、スタイル フラグが目的の値を持つことが保証されます。SetWindowLong() をピンボークすると遅くなります。Handle プロパティが必要なため、最初にウィンドウを作成する必要があります。GWL_STYLE および GWL_EXSTYLE と一緒に使用するのは危険です。古いバージョンの Windows はそれについて不機嫌でした。Winforms はこれを行わないため、実際にウィンドウを再作成して、新しいスタイル フラグを CreateWindowEx() に渡すことができます。RecreateHandle() メソッドに注意してください。これは、内部のスタイル フラグであるプロパティが変更されたときに使用されます。Winforms には、Windows 98 もサポートしなければならないという負担がありました。

私のプログラムは Linux/Mac の Mono で動作しますか?

確かではありませんが、実際に試してみる必要があります。しかし、明らかに、あなたには良い「たぶん」があります。ピンボークに頼る場合、オッズはゼロです。

StackOverflow で GetWindowLong / SetWindowLong を使用するよう人々に伝えますか?

慣性だと思います。SetWindowsLong() は 25 年以上前から存在しており、CreateParams は 10 年前のものであり、まだあまり知られていません。

次の質問を先取りします: いいえ、Windows の各バージョンによるウィンドウ ライフ サイクルの正確な時間に、定義済みのウィンドウ クラスに対して安全に変更できるスタイル フラグの包括的なリストを見たことがありません。そのようなリストが存在しない、または信頼できる可能性があることを確認するには、試行錯誤が必要です。スタイルの変更を有効にするには、SWP_FRAMECHANGED を使用して SetWindowsPos() を呼び出す必要がある場合があることに注意してください。

于 2012-12-21T12:20:58.430 に答える