[問題] FindWindow& SetWindowLong用法

作者: gecer (gecer)   2017-11-30 08:31:12
開發平台(Platform): (Ex: Win10, Linux, ...)
win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++ 2010 win32 application
預期的正確結果(Expected Output):
https://imgur.com/a/9FppK
如上圖 小弟的目的是要將已有的程式(From1) 遮蔽部分區域 讓user無法點擊/看見部分
區域小弟的想法是用FindWindow先取得Form1的handle 再用SetWindowLongPtr增加Form1
的Wndproc 在裡面paint圖 但是卻毫無反應 在新增的Wndproc裡面設breakpoint 發現
新增的Wndproc沒有執行
程式碼(Code):(請善用置底文網頁, 記得排版)
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
LRESULT CALLBACK myNewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
lParam);
WNDPROC prevWndProc;
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int
nCmdShow)
{
//catch Form1 handler and add new Wndproc
HWND my_h = FindWindow(NULL, L"Form1");
prevWndProc = (WNDPROC) SetWindowLongPtr(my_h, GWL_WNDPROC,
(LONG_PTR)&myNewWndProc);
UpdateWindow(my_h);
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//new wndproc for Form1
LRESULT CALLBACK myNewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return CallWindowProc(prevWndProc, hwnd, uMsg, wParam, lParam);
}
作者: stupid0319 (徵女友)   2017-11-30 09:16:00
Wndproc不是這樣疊加上去的吧.........你應該要把不要的東西先SW_HIDE,再畫上paint
作者: schizophrena (你很記者你很腦殘)   2017-12-01 08:25:00
WndProc是個virtual function 你這樣他不會知道你是要多載原本的Wndproc

Links booklink

Contact Us: admin [ a t ] ucptt.com