[英]How to detect if an application has UI elements in it from C# in Windows 7?
我在Windows 7中運行的ac#應用程序在會話0中運行。此應用程序基本上是一個軟件補丁安裝的框架,它將在后台安裝補丁(在會話0中)。
所以這個應用程序將從服務器下載補丁並開始在客戶端計算機上安裝它們。 安裝補丁的方法是調用CreateProcess(“Patch.exe”)。
現在大多數情況下,Patch.exe將是一個非ui靜默安裝,從此以后,從會話0安裝補丁成功完成。
但是,有時這個Patch.exe中碰巧有一些UI元素,比如提示用戶提供一些細節(比如安裝位置等等),讓我們說這些UI元素是無法避免的。
那么我的安裝框架(在用C#編寫的Session 0中運行)是否可以知道我的框架創建的進程Patch.exe中有任何UI元素?
我問的原因是,如果我確定應用程序中有任何UI元素,那么我不想繼續安裝(這樣做的粗略方法是殺死安裝程序進程Patch.exe,但那是一個不同的故事,而不是在這里關注)。
不容易。 如果它們是本機Win32可執行文件,您可以嘗試掛鈎CreateWindowEx WinAPI函數。 (有關掛鈎API調用的方法,請參閱Detours 。)
對於.NET,您可以確定它是否引用System.Windows.Forms程序集。
兩者都不是一個完美的解決方案。 最好的解決方案是強制一個策略,補丁永遠不應該顯示UI(或者可以接受命令行來禁止任何UI)。 但我猜這不可能。
您可以使用EnumWindows
API函數遍歷每個窗口並通過調用GetWindowThreadProcessId
檢查它是否屬於您的Patch.exe實例(假設您已為Patch.exe創建了進程並擁有其PID)。 您可以通過使用GWL_STYLE
參數調用GetWindowLong
來強制執行此檢查,並檢查生成的樣式是否設置了WS_VISIBLE
位。 某些應用程序可以創建隱藏的窗口來執行與用戶界面實際上沒有關系的事情。
或者,您可以使用帶有參數EVENT_OBJECT_CREATE
SetWinEventHook
在每次創建新窗口時接收通知。 然后您可以執行上述檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.