Мне нужно перехватить сообщение Paste, которое отправляется моему объекту CHtmlView. Согласно Spy ++, оно отправляется как сообщение WM_COMMAND, но также согласно Spy ++ сообщение отправляется не объекту CHtmlView, а скорее объекту Internet Explorer_Server (или IWebBrowser2), который он оборачивает. Сообщение WM_COMMAND, о котором идет речь, не видно ни в каких других родительских объектах (я обнаружил это путем наблюдения и с помощью Spy ++).
Как мне перехватить это (или, скажем, сообщение «Выбрать все»)? Я наблюдал за AfxCallWndProc правильное сообщение WM_COMMAND, и оно там не показывается.
Чтобы перехватить сообщение (например, WM_COMMAND), вам нужно создать подкласс окна (в вашем случае Internet Explorer_Server), вызвав:
BOOL SetWindowSubclass(
_In_ HWND hWnd,
_In_ SUBCLASSPROC pfnSubclass,
_In_ UINT_PTR uIdSubclass,
_In_ DWORD_PTR dwRefData
);
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773183(v=vs.85).aspx#set_windowsubclass
После этого ваша собственная процедура Windows сначала берет на себя управление, и вы можете решить, что делать с сообщением.
Других решений пока нет …