片段 Win32 模式窗體 訊息路由

2022-01-12 07:20:17 字數 1980 閱讀 8515

近來,有個需求: 和乙個外部程式對接。

具體是,我這邊 主程式用 process 啟動外部程式。外部程式啟動後,我這邊呼叫的窗體不允許再進行任何操作。

當外部程式關閉時,外部程式會向我這邊的主程式 返回結果。

1 process process = process.start("

外部程式.exe

", "

-外部程式的引數");

2 process.exited += (sender, e)=>

3 process.waitforexit(); //

主程式等待 外部程式執行結束

以往,三行** 就能搞定。 但是有個問題:process.waitforexit();這段**,將會導致 ui執行緒 假死。

—— 這種使用者體驗 自然是 非常不好的。

點選主窗體,如何讓外部程式彈出模式窗體(非常難表達)

—— 就是說:啟動外部程式後,如果我點選 主程式,這時候 外部程式 主動彈出,蓋過 主程式,就像 模式窗體 一樣。

如下圖,form1 以 模式窗體 開啟 form2, 這時候再點選 form1 —— form2 會自動彈5次。

我們假設,這個外部程式是 visual studio —— 我們點選 form1,結果 visual studio 彈出來 閃了5下 (就像模式窗體一樣)。

效果圖 已經在上面了 —— 一種很小眾的需求。

實現原理:form1 以模式窗體 開啟 form2

當 點選 form1 時,理論上 form2 應該 閃動5下。

但是,我們改寫了 form2 的訊息機制,我們將 閃動5下 的 訊息,路由給了 visual studio。

於是,最終的效果就是,我點選 form1,結果 外部程式 visual studio 卻很像模式窗體 一樣的 閃了5下。

關鍵**就在 form2

1

private datetime m_dialogtime =datetime.now;

2protected

override

void wndproc(ref

message m)318

1920

if (m.msg ==win32msg.wm_ncactivate)

2132}33

base.wndproc(ref

m);34 }

以上效果,想必有人質疑了:

問題1:

問: 主程式是 form1, 使用者點選的也是 form1 —— 請問:form2 有什麼用?

答: form2 就是 用來路由訊息的,把 原本 form2 的訊息 路由給 外部程式。

問題2:

問: form2 只是提供訊息的?那為什麼不直接模擬 閃動5次的 訊息? 為什麼不刪掉 form2?

答:閃動5次,spy++ 攔截到的訊息有 60多個,用**模擬訊息 —— 至少就是 100多行**,還不一定正確。

form2 確實可以刪除,也確實可以用 **來模擬訊息 —— 這個設想是可行的,就是**量大,麻煩而已。

問題3:

問: 多出來的 form2 影響使用者體驗

答:你可以把 form2 調整為 1x1 畫素 —— 然後把這個 form2 藏起來。

或者,你可以把 form2 做成乙個 半透明的 提示窗體,其實也挺美觀的。

Win32窗體建立

include 視窗過程函式 lresult callback wndproc hwnd hwnd,uint umsg,wparam wparam,lparam lparam return defwindowproc hwnd,umsg,wparam,lparam int winapi winmai...

win32 訊息機制

2 windows訊息系統組成 訊息佇列 作業系統負責為程序維護乙個訊息佇列,程式執行時不斷地從訊息佇列進行訊息的獲取,處理訊息 訊息迴圈 應用程式不斷地獲取訊息,處理訊息構成訊息迴圈。3 win32訊息路由 1.訊息產生 2.系統將訊息排列到其應該排放的執行緒的訊息佇列中。3.執行緒中的訊息迴圈呼...

win32 訊息機制

本次使用的開發環境是vs2013,使用的開發語言是c c 建立的專案是win32專案 當 windows 應用程式開始執行時,系統會為該程式建立乙個訊息 佇列用於存放訊息,然後用 getmessage 等進行訊息獲取處理。程式從佇列中獲取訊息後處理 分為系統訊息佇列 有系統維護,存放系統產生的訊息如...