求高人解决HOOK有关问题——使某个窗口的标题永远为为"XXX"
求高人解决HOOK问题——使某个窗口的标题永远为为"XXX"
我一开始想用WH_CALLWNDPROC,试了下,不可以用这个,因为这个是在消息发到目标窗口之前的
最后决定用这个WH_CALLWNDPROCRET
MessageBox可以正常显示,SetWindowText就没效果了
dll.def:
dllcpp:
execpp:
------解决方案--------------------
SetWindowText也会发WM_SETTEXT消息
我一开始想用WH_CALLWNDPROC,试了下,不可以用这个,因为这个是在消息发到目标窗口之前的
最后决定用这个WH_CALLWNDPROCRET
MessageBox可以正常显示,SetWindowText就没效果了
dll.def:
- C/C++ code
LIBRARY HookDll EXPORTS SetHook uHook
dllcpp:
- C/C++ code
#include <windows.h> #pragma data_seg("SetWindowTextHookEx") HWND g_hwnd = 0; char *g_title = 0; HHOOK hhgm = 0; #pragma data_seg() #pragma comment(linker,"/section:SetWindowTextHookEx,RWS") BOOL SetText(); LRESULT CALLBACK CallWndProc(int code, WPARAM wParam, LPARAM lParam ) { CWPRETSTRUCT *cs = (CWPRETSTRUCT *)lParam; if(code==HC_ACTION) { if(cs->hwnd == g_hwnd) { if(cs->message == WM_SETTEXT) { //MessageBox(0,0,0,0); //SendMessage(g_hwnd,WM_SETTEXT,0,(LPARAM)g_title); SetText(); } } }else if(code<0) { return CallNextHookEx(hhgm,code,wParam,lParam); } return 0; } bool SetHook(HWND hwnd,char *title) { hhgm = SetWindowsHookEx(WH_CALLWNDPROCRET,CallWndProc,GetModuleHandle("HookDll"),NULL); if(hhgm) { g_hwnd = hwnd; g_title = title; return true; }else { return false; } } BOOL uHook() { return UnhookWindowsHookEx(hhgm); } BOOL SetText() { MessageBox(g_hwnd,"NOW",0,0); return SetWindowText(g_hwnd,g_title); }
execpp:
- C/C++ code
#include <Windows.h> #pragma comment(lib,"HookDll.lib") _declspec(dllimport) bool SetHook(HWND hwnd,char *title); _declspec(dllimport) BOOL uHook(); LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HWND hwnd,hb; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrveInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; wcex.cbClsExtra=0; wcex.cbSize=sizeof(WNDCLASSEX); wcex.cbWndExtra=0; wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); wcex.hCursor=LoadCursor(NULL,IDC_ARROW); wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION); wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION); wcex.hInstance=hInstance; wcex.lpfnWndProc=WndProc; wcex.lpszClassName="ClassName"; wcex.lpszMenuName=NULL; wcex.style=CS_HREDRAW|CS_VREDRAW; RegisterClassEx(&wcex); //hi = hInstance; hwnd=CreateWindow(wcex.lpszClassName,"Title",WS_OVERLAPPEDWINDOW+WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,350,250,NULL,NULL,hInstance,NULL); hb=CreateWindow("Button","Title",WS_CHILDWINDOW+WS_VISIBLE,0,0,100,50,hwnd,NULL,hInstance,NULL); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_CREATE: break; case WM_COMMAND: if((HWND)lParam==hb) { //SendMessage(hWnd,WM_SETTEXT,99,(LPARAM)"agsagas"); bool result = SetHook((HWND)3278740,"想修改?没门!"); if(result) { MessageBox(hWnd,"chenggong",0,0); }else { MessageBox(0,"shibai",0,0); } } break; case WM_DESTROY: uHook(); PostQuitMessage(0); break; default: return DefWindowProc(hWnd,message,wParam,lParam); break; } return 0; }
------解决方案--------------------
SetWindowText也会发WM_SETTEXT消息