[問題] FindWindow& SetWindowLong用法

看板C_and_CPP (C/C++)作者 (gecer)時間8年前 (2017/11/30 08:31), 8年前編輯推噓1(103)
留言4則, 2人參與, 8年前最新討論串1/1
開發平台(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); } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.255.5.159 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1512001875.A.5B5.html ※ 編輯: gecer (111.255.5.159), 11/30/2017 08:39:20

11/30 09:16, 8年前 , 1F
Wndproc不是這樣疊加上去的吧.........
11/30 09:16, 1F

11/30 09:19, 8年前 , 2F
你應該要把不要的東西先SW_HIDE,再畫上paint
11/30 09:19, 2F

12/01 08:25, 8年前 , 3F
WndProc是個virtual function 你這樣他不會知道
12/01 08:25, 3F

12/01 08:26, 8年前 , 4F
你是要多載原本的Wndproc
12/01 08:26, 4F
文章代碼(AID): #1Q7r5JMr (C_and_CPP)
文章代碼(AID): #1Q7r5JMr (C_and_CPP)