/*
拦截一个窗口的信息(进程内),其实就两个函数:SetWindowLong,CallWindowProc,原理吗?你知道的。
这就是所谓的大名鼎鼎的窗口子类化,其实这是一个应用,一个形象的说明。也可以说hook.
更深一步的是:AttachThreadInput,比如主窗口能接受子窗口的信息等。
很早就知道窗口的子类化,今做一个小节。其实很简单,也很简单,要说的很简单。
*/
#include <Windows.h>
#pragma comment(linker, "/ENTRY:Entry")
#pragma comment(linker, "/subsystem:windows")
HWND main_hwnd;//注意主窗口不能被子类化,至少我没有成功。
HWND sub_hwnd;
WNDPROC sub_proc;
LRESULT APIENTRY EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_CHAR)
{//注意有的消息对某些控件没有。
MessageBox(0,0,0,0);
}
return CallWindowProc(sub_proc, hwnd, uMsg, wParam, lParam); //处理完毕后,调用原始edit回调函数。或者上面的直接返回。
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
sub_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,L"Edit",0,WS_CHILD | WS_VISIBLE | SS_LEFT | WS_GROUP,0,0,0x99,0x99,hWnd,0,GetModuleHandle(0),0);
sub_proc = (WNDPROC) SetWindowLong(sub_hwnd, GWL_WNDPROC, (LONG) EditSubclassProc); //设置edit控件的回调函数为EditSubclassProc
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return(0);
}
void Entry()
{
WNDCLASSEX sWndClassEx = {48,3,WindowProc,0,0,GetModuleHandle(0),0,LoadCursor(0,IDC_ARROW),(HBRUSH)6,0,L"correy",0};
ATOM a = RegisterClassEx(&sWndClassEx);
main_hwnd = CreateWindowEx(0,L"correy",L"correy",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,0,0, GetModuleHandle(0),0);
ShowWindow(main_hwnd,1);
MSG sMsg;
while (GetMessage(&sMsg, NULL, 0, 0))
{
TranslateMessage(&sMsg);
DispatchMessage(&sMsg);
}
ExitProcess(0);
}
//made at 2012.03.14
没有评论:
发表评论