0

私はそれを次のように使用して理解する方法を学ぼうとしてSetWindowLongPtr()います:

  1. 次の関数を使用して、現在のメッセージを取得し、カスタム プロトコルに送信できます。 LONG_PTR Some_Ptr = SetWindowLongPtr(Some_Hwnd, GWLP_WNDPROC, (LONG_PTR)Custom_Proc);

  2. 次の例のように、カスタム プロトコルを作成します。

    static LRESULT CALLBACK Custom_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
            case WM_COMMAND:
                MessageBox(hwnd,"This is a window","OKAY",NULL);
                break;
            default:
                return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam);
                break;  
        }
        return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam);
    }
    

私の質問は次のとおりです。

  1. ここで何か不足していますか?これは正しいです?
  2. どこに電話しますSetWindowLongPtr()か? 特定の状況が必要な場合は、ボタン ハンドルSome_Hwndが WM_CREATE で作成されていると想像してください。しかし、私はそれが他の状況に開かれたままにしておくことを望みます.
4

2 に答える 2

4

これは「ウィンドウのサブクラス化」と呼ばれます。これは、コードを変更できないウィンドウの動作を変更できるようにするための標準的なWindowsプログラミング手法です。あなたの場合の組み込みのButtonクラスのように。

ウィンドウの特定のインスタンスのサブクラス化とグローバルサブクラス化など、いくつかの詳細があります。また、スーパークラス化は、ウィンドウが作成される前にウィンドウがカスタマイズされることを保証する手法です。これはすべて、SDKのドキュメントとネイティブのwinapiプログラミングに関する本で詳しく説明されています。Petzoldの「ProgrammingWindows」のように、winapiコードをハックしたい場合は読む必要があります。

于 2013-01-17T20:33:14.377 に答える
3

私はあなたが混乱していると思います。ドキュメントによると、GWLP_WNDPROC は指定されたウィンドウのウィンドウ プロシージャを変更するため、そのウィンドウに送信される今後のメッセージは新しいプロシージャに送られます。私が知っている意味では、「現在のメッセージを取得」しません。

于 2013-01-17T18:58:45.913 に答える