94272


「DefWindowProc()」の動作についていくつか質問があります。既知のメッセージごとに「DefWindowProc()」のすべての動作を正確に説明する集中管理された
MSDN ドキュメントはありますか?

プログラマーは、インターネットコミュニティで検索したり、Windows API をテストしたりせずに、その影響をどのように知ることができますか?

たとえば、「WM_MOUSEMOVE」ページ (<https://learn.microsoft.com/en-
us/windows/win32/inputdev/wm-mousemove>)
を見てみましょう。他のほとんどすべてのメッセージの説明と同様に、多くの質問が寄せられます：

  1. 「DefWindowProc()」の呼び出しを省略した場合、エディタは新しいマウス カーソルの位置を無視しますか? (以下のコードを参照)
[code]      if (Msg == WM_MOUSEMOVE) return 0; // No call to
"DefWindowProc()", what is the effect?

    
[/code]

  2. 「lParam」の値を変更して、コンポーネントへの影響をカスタマイズできますか? (以下のコードを参照)
[code]      if (Msg == WM_MOUSEMOVE) {

    
         int new_X = my_translator_x(GET_X_LPARAM(lParam));
         int new_Y = my_translator_y(GET_Y_LPARAM(lParam));
    
         lParam = MAKELPARAM(new_X, new_Y);
    
         return DefWindowProc(hWnd, Msg, wParam, lParam); // I modified the lParam, is it supported?
    
     }
    
[/code]

  3. アプリケーションがメッセージを処理する場合、アプリケーションは「return zero」を実行する必要があると言われています。これは明らかですが、"DefWindowProc()" を呼び出す必要があるかどうかの手がかりにはなりません。 メッセージの処理と "DefWindowProc()" の呼び出しの両方を行う場合、何を「return」する必要がありますか? (以下のコードを参照)
[code]      if (Msg == WM_MOUSEMOVE) {

    
         custom_actions_before_the_standard_behaviour(hWnd);
    
         LRESULT res = DefWindowProc(hWnd, Msg, wParam, lParam);
    
         custom_actions_after_the_standard_behaviour(hWnd);
    
         return res; // I feel natural to return the result of DefWindowProc, but I processed the message, should I rather return zero to be documentation-conformant?
    
     }
    
[/code]

もちろん、誰かがこれらの特定の質問に答えてくれたらうれしいですが、確かにインターネットのどこかにすでに良い答えがありますが、これらのような質問は他にもたくさんあります.
これが、この件に関するより完全なドキュメントを探している理由です。 標準的なメッセージ動作の完全なリストはどこかにありますか?

ヒントをお寄せいただきありがとうございます。


CC BY-SA 4.0
2023-03-20T20:08:51.157
94258
2023-03-22T09:23:02.273
2023-03-21T00:35:53.393
54819
54819
question
c winapi
「DefWindowProc()」のすべての動作は何ですか?


わかる範囲で答てみます。

(A)「DefWindowProc()」のすべての動作を正確に説明する集中管理された MSDN ドキュメントはありますか?  
=>無いという認識です。  
各メッセージにDefWindowProcに渡された場合の動作について説明されている場合があります。  
説明されている例)WM_SETTEXT、説明されていない例)WM_QUIT 等

(B)1.「DefWindowProc()」の呼び出しを省略した場合、・・・  
=>誤ったコードです。  
デフォルトの処理を無視する必要がある場合、を除いて、  
全てのメッセージをデフォルトプロシージャに渡す必要があります。

(C)2.「lParam」の値を変更して、・・・  
=>デフォルトプロシージャに渡す前にパラメータを加工することはたまに必要となるテクニックで、普通に行われます。

(D)3.アプリケーションがメッセージを処理する場合、アプリケーションは「return zero」を実行する必要があると言われています。・・・  
=>誤った認識です。  
メッセージ毎に戻り値の意味が異なるため、一般論として戻り値はメッセージと処理の内容によって異なります。通常はDefWindowProcの戻り値を戻します。

大昔のドキュメント(Windows2.1、3.1の頃～NT)ではこれらはかなり詳しく説明されていましたが、MFCが登場すると多くは失われました。  
現状ではRegisterClassEx()から始めるコードを書く人はあまりいません。  
従ってWNDCLASSA::lpfnWndProcの中身をどのように書くべきであるかの知識も必要なくなりました。  
しかし、今でもこの仕組みに則ってWindowsは動作しています。

以上、ヒントになれば幸いです。


CC BY-SA 4.0
2023-03-22T09:17:32.700
94272
2023-03-22T09:23:02.273
2023-03-22T09:23:02.273
3793
3793
94258
answer