能否获取向当前应用发送消息的窗口HWND(无需发送方传入自身HWND)
获取SendMessage/PostMessage发送方的HWND(无需发送方主动传递)
答案
- SendMessage 场景:在Windows Vista及以上系统中,直接在窗口过程(WindowProc)处理消息的上下文里调用
GetMessageSenderHWND(),就能拿到发送方的HWND,不需要发送方提前在wparam/lparam中传递自身窗口句柄。注意这个函数只能在处理消息的过程中调用,脱离该上下文会返回无效值。 - PostMessage 场景:无法直接获取发送方的HWND。因为PostMessage是异步调用,消息被放入接收方的消息队列后,发送方就继续执行后续逻辑,系统不会保留发送方的HWND关联信息;后续处理消息时,发送方窗口甚至可能已经销毁,根本无法追溯来源。
兼容旧系统的替代方案(仅针对SendMessage)
如果必须兼容Windows XP及更早版本,只能采用一些间接且可靠性较低的方法:
- 调用
GetWindowThreadProcessId(hWndReceiver, &dwReceiverPID)获取接收窗口的进程ID - 调用
GetCurrentProcessId()获取当前进程ID,若两者不同,说明消息来自外部进程 - 结合
OpenThread、GetThreadContext等函数查询发送线程的相关信息,但这种方法复杂度高、易出问题,优先建议升级系统到Vista及以上版本。
内容的提问来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

