fix(audio,windows): adapt Raw Input + hook backends to windows-rs 0.54 API shape

Initial Task C commit (77c2a1d) used handle constructors and import paths
that match windows-rs 0.58+, not the 0.54 version pinned via the
workspace's transitive 'windows' dep. Compile errors on the Korean
Windows 11 build:

  * HWND/HHOOK/HRAWINPUT take 'pub isize' in 0.54 (became raw pointers
    in 0.58). Use HWND(HWND_MESSAGE_PTR), HHOOK(0), HRAWINPUT(lparam.0)
    instead of *mut _ casts.
  * CreateWindowExW returns HWND directly in 0.54, not Result<HWND>.
    Check hwnd.0 == 0 for null.
  * RegisterClassExW + WNDCLASSEXW are gated behind Win32_Graphics_Gdi
    in 0.54. Added that feature.
  * XBUTTON1 / XBUTTON2 live in Win32::UI::WindowsAndMessaging not
    Win32::UI::Input::KeyboardAndMouse in 0.54.
  * Win32_System_Threading needed for GetCurrentThreadId.
  * Unused Mutex import dropped.

No behavioural change relative to 77c2a1d; just signature alignment.
This commit is contained in:
EdisonJwa
2026-05-15 22:08:02 +08:00
parent 77c2a1def4
commit f9d20d8585
2 changed files with 34 additions and 35 deletions
+2
View File
@@ -41,7 +41,9 @@ ndk-context = "0.1"
# require a per-backend OS thread that owns a message pump. # require a per-backend OS thread that owns a message pump.
windows = { version = "0.54", features = [ windows = { version = "0.54", features = [
"Win32_Foundation", "Win32_Foundation",
"Win32_Graphics_Gdi",
"Win32_System_LibraryLoader", "Win32_System_LibraryLoader",
"Win32_System_Threading",
"Win32_UI_Input", "Win32_UI_Input",
"Win32_UI_Input_KeyboardAndMouse", "Win32_UI_Input_KeyboardAndMouse",
"Win32_UI_WindowsAndMessaging", "Win32_UI_WindowsAndMessaging",
@@ -21,16 +21,13 @@
//! this file never tries. //! this file never tries.
use std::sync::atomic::{AtomicBool, AtomicIsize, Ordering}; use std::sync::atomic::{AtomicBool, AtomicIsize, Ordering};
use std::sync::{Arc, Mutex}; use std::sync::Arc;
use std::thread; use std::thread;
use tracing::{info, warn}; use tracing::{info, warn};
use windows::core::{w, PCWSTR}; use windows::core::{w, PCWSTR};
use windows::Win32::Foundation::{HMODULE, HWND, LPARAM, LRESULT, WPARAM}; use windows::Win32::Foundation::{HMODULE, HWND, LPARAM, LRESULT, WPARAM};
use windows::Win32::System::LibraryLoader::GetModuleHandleW; use windows::Win32::System::LibraryLoader::GetModuleHandleW;
use windows::Win32::UI::Input::KeyboardAndMouse::{
XBUTTON1, XBUTTON2,
};
use windows::Win32::UI::Input::{ use windows::Win32::UI::Input::{
GetRawInputData, RegisterRawInputDevices, HRAWINPUT, RAWINPUT, RAWINPUTDEVICE, GetRawInputData, RegisterRawInputDevices, HRAWINPUT, RAWINPUT, RAWINPUTDEVICE,
RAWINPUTHEADER, RID_INPUT, RIDEV_INPUTSINK, RIDEV_REMOVE, RIM_TYPEKEYBOARD, RIM_TYPEMOUSE, RAWINPUTHEADER, RID_INPUT, RIDEV_INPUTSINK, RIDEV_REMOVE, RIM_TYPEKEYBOARD, RIM_TYPEMOUSE,
@@ -40,7 +37,8 @@ use windows::Win32::UI::WindowsAndMessaging::{
PostThreadMessageW, RegisterClassExW, SetWindowsHookExW, TranslateMessage, PostThreadMessageW, RegisterClassExW, SetWindowsHookExW, TranslateMessage,
UnhookWindowsHookEx, HC_ACTION, HHOOK, HOOKPROC, KBDLLHOOKSTRUCT, MSG, MSLLHOOKSTRUCT, UnhookWindowsHookEx, HC_ACTION, HHOOK, HOOKPROC, KBDLLHOOKSTRUCT, MSG, MSLLHOOKSTRUCT,
WH_KEYBOARD_LL, WH_MOUSE_LL, WINDOW_EX_STYLE, WINDOW_STYLE, WM_INPUT, WM_KEYDOWN, WM_KEYUP, WH_KEYBOARD_LL, WH_MOUSE_LL, WINDOW_EX_STYLE, WINDOW_STYLE, WM_INPUT, WM_KEYDOWN, WM_KEYUP,
WM_QUIT, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_XBUTTONDOWN, WM_XBUTTONUP, WNDCLASSEXW, WM_QUIT, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_XBUTTONDOWN, WM_XBUTTONUP, WNDCLASSEXW, XBUTTON1,
XBUTTON2,
}; };
use super::{AudioTransmitGate, DesktopPttBackend, PttBackendError, PttBinding}; use super::{AudioTransmitGate, DesktopPttBackend, PttBackendError, PttBinding};
@@ -392,30 +390,29 @@ unsafe fn run_raw_input_loop() -> bool {
// class. // class.
let _atom = RegisterClassExW(&wc); let _atom = RegisterClassExW(&wc);
let hwnd = match CreateWindowExW( let hwnd = unsafe {
WINDOW_EX_STYLE(0), CreateWindowExW(
class_name, WINDOW_EX_STYLE(0),
PCWSTR::null(), class_name,
WINDOW_STYLE(0), PCWSTR::null(),
0, WINDOW_STYLE(0),
0, 0,
0, 0,
0, 0,
HWND(HWND_MESSAGE_PTR as *mut _), 0,
None, HWND(HWND_MESSAGE_PTR),
h_instance, None,
None, h_instance,
) { None,
Ok(h) => h, )
Err(e) => {
warn!(
target: "chanora_audio",
error = %e,
"windows ptt: CreateWindowExW(HWND_MESSAGE) failed"
);
return false;
}
}; };
if hwnd.0 == 0 {
warn!(
target: "chanora_audio",
"windows ptt: CreateWindowExW(HWND_MESSAGE) returned null"
);
return false;
}
// Register both keyboard and mouse, both with INPUTSINK so we // Register both keyboard and mouse, both with INPUTSINK so we
// receive events even when unfocused. // receive events even when unfocused.
@@ -475,13 +472,13 @@ unsafe fn run_raw_input_loop() -> bool {
usUsagePage: 0x01, usUsagePage: 0x01,
usUsage: 0x06, usUsage: 0x06,
dwFlags: RIDEV_REMOVE, dwFlags: RIDEV_REMOVE,
hwndTarget: HWND(std::ptr::null_mut()), hwndTarget: HWND(0),
}, },
RAWINPUTDEVICE { RAWINPUTDEVICE {
usUsagePage: 0x01, usUsagePage: 0x01,
usUsage: 0x02, usUsage: 0x02,
dwFlags: RIDEV_REMOVE, dwFlags: RIDEV_REMOVE,
hwndTarget: HWND(std::ptr::null_mut()), hwndTarget: HWND(0),
}, },
]; ];
let _ = RegisterRawInputDevices(&undo, std::mem::size_of::<RAWINPUTDEVICE>() as u32); let _ = RegisterRawInputDevices(&undo, std::mem::size_of::<RAWINPUTDEVICE>() as u32);
@@ -502,7 +499,7 @@ unsafe extern "system" fn raw_input_wnd_proc(
} }
unsafe fn handle_wm_input(lparam: LPARAM) { unsafe fn handle_wm_input(lparam: LPARAM) {
let h_raw = HRAWINPUT(lparam.0 as *mut _); let h_raw = HRAWINPUT(lparam.0);
let mut size: u32 = 0; let mut size: u32 = 0;
let header_sz = std::mem::size_of::<RAWINPUTHEADER>() as u32; let header_sz = std::mem::size_of::<RAWINPUTHEADER>() as u32;
// First call: query buffer size. // First call: query buffer size.
@@ -838,7 +835,7 @@ unsafe extern "system" fn kbd_hook_proc(code: i32, wparam: WPARAM, lparam: LPARA
} }
}); });
} }
CallNextHookEx(HHOOK(std::ptr::null_mut()), code, wparam, lparam) CallNextHookEx(HHOOK(0), code, wparam, lparam)
} }
unsafe extern "system" fn mouse_hook_proc(code: i32, wparam: WPARAM, lparam: LPARAM) -> LRESULT { unsafe extern "system" fn mouse_hook_proc(code: i32, wparam: WPARAM, lparam: LPARAM) -> LRESULT {
@@ -853,9 +850,9 @@ unsafe extern "system" fn mouse_hook_proc(code: i32, wparam: WPARAM, lparam: LPA
let xbutton = (m.mouseData >> 16) as u16; let xbutton = (m.mouseData >> 16) as u16;
let want = ctx.binding.mouse_btn(); let want = ctx.binding.mouse_btn();
let want_xbutton = if want == 4 { let want_xbutton = if want == 4 {
XBUTTON1.0 XBUTTON1
} else if want == 5 { } else if want == 5 {
XBUTTON2.0 XBUTTON2
} else { } else {
0 0
}; };
@@ -870,5 +867,5 @@ unsafe extern "system" fn mouse_hook_proc(code: i32, wparam: WPARAM, lparam: LPA
} }
}); });
} }
CallNextHookEx(HHOOK(std::ptr::null_mut()), code, wparam, lparam) CallNextHookEx(HHOOK(0), code, wparam, lparam)
} }