2012年7月5日星期四

SetWindowLongPtr.cpp


/*
拦截一个窗口的信息(进程内),其实就两个函数: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

没有评论:

发表评论