[问题] 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