1

SetWindowSubclass() を使用してウィンドウをサブクラス化し、メッセージ ハンドラーが正常に呼び出されましたが、DefWindowProc() を呼び出して元の処理のためにメッセージを渡すと、メッセージがまったく通過しません!

Marmalade (クロスプラットフォーム モバイル開発用キット) の拡張機能を作成しています。これにより、特定のプラットフォーム用のネイティブ拡張が可能になり、Windows デスクトップ ビルド用に作成しています。メッセージ ループに直接アクセスすることはできませんが、サブクラス化してメッセージを自分で処理することはできますが、通常の処理のためにメッセージを Marmalade に戻すことはできないようです。

たとえば、コールバックで何もせずに DefWindowProc() を呼び出しても機能しません。

// Initialization:
const UINT_PTR gSubClassId = NULL;
DWORD_PTR subClassCBData = NULL;
SetWindowSubclass(gMainWindow, CadUtil_WindowCB, gSubClassId, subClassCBData);
...
// Message processing callback.
static LRESULT CALLBACK CadUtil_WindowCB(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    // Messages are correctly diverted here, but DefWindowProc() below isn't passing them on.
    return DefWindowProc(hWnd, message, wParam, lParam);
}

これがどのように起こるか考えていますか?

ありがとう、
ロブ。

4

2 に答える 2

1

コード例の問題は、ウィンドウをサブクラス化するときに DefWindowProc の代わりに DefSubclassProc を呼び出す必要があることだと思います。

于 2013-10-17T20:43:23.927 に答える
0

なぜサブクラス化が機能しなかったのかはまだわかりませんが、代わりにフックを使用することで回避できました。したがって、SetWindowSubclass() を使用してメッセージをキャプチャし、DefWindowProc() を使用してメッセージを渡す代わりに、SetWindowsHookEx() を WH_CALLWNDPROC および WH_GETMESSAGE と共に使用してメッセージをキャプチャし、フックで CallNextHookEx() を呼び出してメッセージを渡します。これは、サブクラス化が機能しない場所で機能します。

于 2013-10-04T02:09:09.653 に答える