gpt4 book ai didi

C++ 在运行时更改 HWND 窗口过程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:01 24 4
gpt4 key购买 nike

我在一个创建 hwnd 及其相应的 WndProc LRESULT CALLBACK 的 IDE 中工作。我需要将 WndProc 更改为自定义的。

我读过 SetWindowLong 可以完成这项工作,但我找不到任何工作示例。例如:

HWND hwnd;//我的窗口

SetWindowLong(hwnd, GWL_WNDPROC, myNewWndProc);

SetWindowLong 的第三个参数是一个 Long,正如函数的名称一样。如何从我的 WndProc 函数引用一个 Long

我的WndProc:

LRESULT CALLBACK WndProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

msg_dev(toString(uMsg));

switch(uMsg){

case WM_MOUSEMOVE:
SetCursor(LoadCursor(NULL, IDC_HAND));
break;

case WM_LBUTTONDOWN:
msg_dev("Button down!");
break;

default:
DefWindowProc(hwnd, uMsg, wParam, lParam);
}

return 0;
};

最佳答案

你需要使用这样的东西:

WNDPROC prevWndProc;
...
prevWndProc = (WNDPROC) SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)&myNewWndProc);
...
LRESULT CALLBACK myNewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
msg_dev(toString(uMsg));

switch(uMsg)
{
case WM_MOUSEMOVE:
SetCursor(LoadCursor(NULL, IDC_HAND));
break;

case WM_LBUTTONDOWN:
msg_dev("Button down!");
break;
}

return CallWindowProc(prevWndProc, hwnd, uMsg, wParam, lParam);
}

查看这篇文章:

When you subclass a window, it's the original window procedure of the window you subclass you have to call when you want to call the original window procedure

也就是说,你应该使用 SetWindowSubclass()而不是 SetWindowLongPtr()。请参阅这篇文章:

Safer subclassing

例如:

SetWindowSubclass(hwnd, &mySubClassProc, 1, 0);
...
LRESULT CALLBACK mySubClassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
msg_dev(toString(uMsg));

switch(uMsg)
{
case WM_MOUSEMOVE:
SetCursor(LoadCursor(NULL, IDC_HAND));
break;

case WM_LBUTTONDOWN:
msg_dev("Button down!");
break;

case WM_NCDESTROY:
RemoveWindowSubclass(hWnd, &mySubClassProc, 1);
break;
}

return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

关于C++ 在运行时更改 HWND 窗口过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31648180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com