1

ユーザーがシステムメニューでメニュー項目コマンドを選択すると、アプリケーションはWM_SYSCOMMANDメッセージを受信するため、wParamはSC_CLOSE、SC_CONTEXTHELP、SC_MAXIMIZE、SC_MINIMIZE、SC_RESTOREなどになります。これは論理的です。(もちろん、最小化、最大化、閉じるボタンなどをクリックして、これらのメッセージを送信することもできます。)

ただし、WM_SYSCOMMANDメッセージを送信して、コマンドをWindowsシェルに送信することもできます。たとえば、スタートメニュー(SC_TASKLIST)を表示し、スクリーンセーバー(SC_SCREENSAVE)をアクティブにして、モニター(SC_MONITORPOWER)をオフにすることができます。これは意味がありませんね。これは、アプリケーションのシステムメニューと何の関係がありますか?これは、より「システムコマンド」、つまりメッセージの「WM_SYSCOMMAND」という名前の完全に別の解釈です。これは、メッセージがコマンド要求をシステムに送信するために使用されるようなものです。

このメッセージが2つの一見まったく異なるものに使用されるのはなぜですか。また、「SYSCOMMAND」という名前は何を指しますか(システムメニューのコマンドまたはオペレーティングシステムのコマンド)。

4

4 に答える 4

2

ユーザーがウィンドウ メニュー (以前はシステムまたはコントロール メニューと呼ばれていました) からコマンドを選択したとき、またはユーザーが最大化ボタン、最小化ボタン、復元ボタン、または閉じるボタンを選択したときに、ウィンドウはこのメッセージを受け取ります。

ユーザーがシステム メニューまたはキャプション ボタンを使用すると、これらの WM_SYSCOMMAND (最大化、最小化、復元、閉じる、およびシステム メニューのもの) がウィンドウに送信される場合があります。私は(私のWin32は非常に錆びている)これらは通常、DefWindowProcによって処理され、すべての汚れた作業を行い、ウィンドウに通知を送信します(WM_SIZE / WM_SIZING、WM_CLOSEなど)。

さて、さらに下に(一番下の宣伝文句に隠されています):

アプリケーションは、WM_SYSCOMMAND メッセージを DefWindowProc に渡すことによって、いつでも任意のシステム コマンドを実行できます。アプリケーションによって処理されない WM_SYSCOMMAND メッセージは、DefWindowProc に渡す必要があります。

DefWindowProc に送信することで、特定の WM_SYSCOMMAND を実行することもできます。これらには上記のものも含まれますが、SC_SCREENSAVE や SC_TASKLIST などの追加のものも含まれます。SC_SCREENSAVE のようなものが DefWindowProc を介してどのようなパスをたどって最終的にスクリーンセーバーをトリガーするかはわかりませんが、それがその方法です。

したがって、WM_SYSCOMMAND のクラス全体がシステム コマンドであることがわかります。それらの一部 (ウィンドウのキャプションからアクセスできるもの) はウィンドウに送信され、その他はユーザーの裁量でウィンドウから送信されるだけです。

于 2010-05-02T23:19:48.083 に答える
0

これは、16 ビット Windows の遺産です。

Bob Gunderson の記事をググってください:《GetMessage and PeekMessage Internals》、Microsoft Developer Network Technology Group、1992 年 12 月 11 日

Windows 3.1 の時代、オペレーティング システムは非プリエンプティブでシングル スレッドでした。GetMessage/PeekMessage 関数がシステム キューにアクセスし、CTRL-ESC キーが押されたときに、wParam の SC_TASKLIST を使用して WM_SYSCOMMAND メッセージがアクティブなアプリケーション (シングル スレッド システムだったことを思い出してください) にポストされました。キー ダウン イベントは、タスク マネージャー ウィンドウを表示するように Windows に指示していました。

于 2017-09-22T01:10:53.620 に答える
0

WM_SYSCOMMAND は WM_COMMAND のシステム バージョンにすぎず、同じセマンティクスに従います。WM_COMMAND メッセージは、ユーザーがメニューからアイテムを選択したり、ボタンをクリックしたり、ラジオ ボタンを選択したりすると、アプリケーションに送信されます。ID パラメーターは、クリックされた内容を示します。コマンドは、SendMessage() または PostMessage() を使用して手動で送信することもできます。

于 2010-05-02T23:40:35.163 に答える