【问题标题】:How to pass RawWindowHandle::Windows to winapi::winuser::SetWindowPos如何将 RawWindowHandle::Windows 传递给 winapi::winuser::SetWindowPos
【发布时间】:2021-01-29 18:28:20
【问题描述】:

我正在尝试使我使用 winit 板条箱创建的窗口始终位于顶部 (HWND_TOPMOST)。我正在创建我的窗口,并从中获取RawWindowHandle::Windowsstruct 有一个pub hwnd,它是一个*mut c_void。我现在的问题是,如何将 *mut c_void 转换为 *mut winapi::shared::windef::HWND__ 以便将其传递给 winapi::winuser::SetWindowPos(...)

这是我获取原始窗口句柄的代码:

let win_handle = match window.raw_window_handle() {
    RawWindowHandle::Windows(windows_handle) => windows_handle.hwnd,
    _ => panic!("Unsupported platform!"),
};

这是我将win_handle 传递给SetWindowPos 的代码:

unsafe {
    if winuser::SetWindowPos(win_handle, winuser::HWND_TOPMOST, 0, 0, 0, 0, winuser::SWP_NOMOVE | winuser::SWP_NOSIZE) == 1 {
        println!("Success");
    } else {
        println!("Failure");
    }
}

我做错了什么?

【问题讨论】:

  • 更简单的解决方案:让 Rust 找出类型。在您致电SetWindowPos 时,只需传递win_handle as _。但请记住:What if two programs did this?
  • @IInspectable 啊,这也有效。感谢您的提示,虽然我以简单的方式解决了我的问题(让 winit 为我处理),但我会记住,每当我需要投射一些东西时

标签: winapi rust


【解决方案1】:

原来,有一个HWND struct,您可以简单地将*mut c_void 投射到该*mut c_void,如下所示:

let winapi_handle = win_handle as winuser::shared::windef::HWND;

// Or even simple, cast it in the call with 'as _'
// Shoutout to @IInspectable
SetWindowPos(win_handle as _, winuser::HWND_TOPMOST, 0, 0, 0, 0, winuser::SWP_NOMOVE | winuser::SWP_NOSIZE)

编辑:只有在我尝试了这个之后,我才真正搜索了“Winit set window always on top”并找到了this。因此,在使用WindowBuilder 构建窗口时,您只需调用

window_builder.with_always_on_top(true)

它会在所有受支持的平台上为您执行此操作(Linux、Windows 和 MacOS。Adnroid、iOS 和 Web 不支持它)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多