gpt4 book ai didi

winapi - Windows 键盘加速器和子窗口

转载 作者:行者123 更新时间:2023-12-04 07:00:23 24 4
gpt4 key购买 nike

我使用 C 和 Windows API 创建了一个 Windows GUI 程序,我希望该程序使用键盘加速器。我已经设置了一些工作正常的加速器,但是当焦点转到我程序主窗口的子窗口时,例如 ListView 控件或状态栏控件,键盘加速器似乎正在转换为 WM_COMMAND 消息用于子窗口而不是主窗口。因此,当焦点位于子控件上时,我在主窗口的 WndProc 中处理适当的 WM_COMMAND 消息将被忽略。

我应该如何解决这个问题?

最佳答案

我找到了答案。主窗口的子窗口必须被子类化,这样键盘加速器生成的 WM_COMMAND 消息才能被拦截并传递给父窗口。

这涉及将控件的窗口过程更改为不同的过程。备用过程通过将它们发送到父窗口来处理应该被拦截的消息。还必须将指向原始窗口过程的指针存储在某处,以便控件能够正确运行。

可以使用 SetWindowLongPtr 更改窗口过程。使用 GWLP_WNDPROC。

下面是一个简单的示例,说明如何通过在控件的用户数据值 (GWLP_USERDATA) 中存储指向原始窗口过程的指针来执行此操作:

更改窗口过程并将原始过程存储在 GWLP_USERDATA 中的代码:

SetWindowLongPtr( hWnd, GWLP_USERDATA, ( LONG_PTR )SetWindowLongPtr( hWnd, GWLP_WNDPROC, ( LONG_PTR )WndProc ) );

截取窗口程序:
static LRESULT CALLBACK WndProc( const HWND hWnd, const UINT message, const WPARAM wParam, const LPARAM lParam )
{
switch( message )
{
case WM_COMMAND:
SendMessage( GetParent( hWnd ), message, wParam, lParam );
return 0;
default:
//Assume that GWLP_USERDATA has been set to the original window procedure.
return CallWindowProc( ( WNDPROC )GetWindowLongPtr( hWnd, GWLP_USERDATA ), hWnd, message, wParam, lParam );
}
}

关于winapi - Windows 键盘加速器和子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1962659/

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