ChangeWindowMessageFilter (原生 API) 讓自訂訊息穿透權限邊界同管理代碼版:控制台 → 使用者帳戶控制設定 → 確認非「從不通知」。

BrokenNativePingPong.exe 兩次 → 兩視窗正常交換「Ping Pong」訊息(皆為 Medium IL)


以系統管理員身分執行(High IL)
PingPong.cpp 核心邏輯在 PingPongDlgProc 對話框程序RegisterWindowMessage 取得全域訊息 ID (uMsgBall)WinMain 用 FindWindow 尋找另一執行個體視窗Timer 每 500ms 發送訊息uMsgBall = RegisterWindowMessage(sMessageBall);
if (!uMsgBall) return FALSE;
// 允許我們的訊息即使由低權限進程發送也能通過
ChangeWindowMessageFilter(uMsgBall, MSGFLT_ADD);
關鍵點:MSGFLT_ADD 將訊息加入允許清單,MSGFLT_REMOVE 移除。Windows 7 另提供 ChangeWindowMessageFilterEx 可針對特定 HWND 設定。
NativePingPongLoader.exe 測試修復後,Medium 進程發送的 uMsgBall 成功送達 High 進程,通訊恢復正常。完整解決方案在 PingPongFixed。
| 被阻擋的操作 (低 IL → 高 IL) | 永遠允許的訊息 (部分) |
|---|---|
|
|
原生與受控代碼面對 UIPI 的核心挑戰相同:跨完整性層級的視窗訊息預設被阻擋。解決之道統一為「註冊自訂訊息 → 加入訊息過濾器允許清單」。原生版直接呼叫 ChangeWindowMessageFilter,受控版需 P/Invoke 包裝。掌握 Process Explorer 觀察 IL 欄位,是快速定位此類問題的關鍵技能。