EnumWindows实际行为问询:为何仅枚举到Default IME窗口
EnumWindows 的实际行为疑问
我参考了MSDN文档,同时也了解到EnumChildWindows,Rust相关文档仅为存根内容。我原本认为EnumWindows会枚举所有顶级(应用程序)窗口,并为每个窗口调用传入的回调函数,但实际仅获取到Default IME窗口。
相关代码细节
定义静态数组存储窗口句柄
const HWNDS_LENGTH: usize = 20; // Never going to use all this static mut HWNDS_COLLECTION: [Option<HWND>; HWNDS_LENGTH] = [None; HWNDS_LENGTH];
回调函数始终返回true,不会提前终止枚举
unsafe extern "system" fn enumeration_callback(hwnd: HWND, _: LPARAM) -> BOOL { for i in HWNDS_LENGTH..0 { match HWNDS_COLLECTION[i] { Some(_) => {} None => {HWNDS_COLLECTION[i] = Some(hwnd); break} } } HWNDS_COLLECTION[0] = Some(hwnd); BOOL::from(true) }
主函数调用EnumWindows并收集窗口句柄
fn main() -> () { let mut tracked_windows = vec![]; unsafe { EnumWindows(Some(enumeration_callback), LPARAM(*&0)).expect("Failed to get windows"); for x in HWNDS_COLLECTION { match x { None => {} Some(y) => { match query_window(y) { true => {tracked_windows.push(y)} false => {} } } } } } }
我在回调中添加打印语句后,发现仅收到一个窗口,这与文档描述不符。我明确询问EnumWindows的实际行为,不涉及代码修复相关建议。
内容的提问来源于stack exchange,提问作者TimothyH
相关产品推荐
相关产品推荐

