问题描述
我正在一个IDE中创建一个hwnd
及其相应的WndProc
LRESULT CALLBACK
.我需要将WndProc
更改为自定义名称.
I'm working in an IDE which creates a hwnd
and its respective WndProc
LRESULT CALLBACK
. I need to change the WndProc
to a custom one.
我已经阅读到SetWindowLong
可以完成工作,但是我找不到任何有效的示例.例如:
I've read that SetWindowLong
would do the job but I can't find any working example. For example:
HWND hwnd; //My window
SetWindowLong(hwnd, GWL_WNDPROC, myNewWndProc);
SetWindowLong
的第三参数是Long
,因为函数名称为其命名.如何从我的WndProc
函数引用到Long
?
Third parameter for SetWindowLong
is a Long
as the name of the function names it. How can I make a reference from my WndProc
function to a 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);
}
查看本文:
子类化窗口时,它是子类化窗口的原始窗口过程要调用原始窗口过程时调用
话虽如此,您应该使用 SetWindowSubclass()
而不是SetWindowLongPtr()
.看到这篇文章:
That being said, you should use SetWindowSubclass()
instead of SetWindowLongPtr()
. See this article:
例如:
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窗口过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!