[問題] FindWindow& SetWindowLong用法
開發平台(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
11/30 09:16, 1F
→
11/30 09:19,
8年前
, 2F
11/30 09:19, 2F
推
12/01 08:25,
8年前
, 3F
12/01 08:25, 3F
→
12/01 08:26,
8年前
, 4F
12/01 08:26, 4F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章