2012-04-17 34 views
1

我有一個VB6應用程序需要通過自動關閉來響應更新調用。沒有用戶交互應該是必要的關閉應用程序。除非系統對話框已打開,否則這一切都可以正常工作。該對話框可用於打開文件或設置打印機屬性。事情是這樣的:如何關閉由我自己的應用程序打開的對話框

http://tweakers.net/ext/f/Kjz0R5IvkCNfXRRefrqHFmFc/full.png

「打印設置」窗口,將仍接近正常,但屬性對話框是一個系統對話框我的程序關閉時不會關閉。結果是應用程序不會關閉,但仍然(不可見)活動。我必須使用任務管理器強制關閉它。

開放形式可以用這樣的代碼來檢測:

For Each Form In Forms 
    ... 
Next Form 

這些對話框不此數組的打開形式出現。有沒有辦法檢測我的應用程序打開的所有系統對話框,並以有序的方式關閉它們?

+0

嘗試使用unloadMe隱藏當前打開的表單並顯示其他表單使用LoadFormName。 – coder 2012-04-17 09:11:40

+0

@coder關閉窗體不是問題。系統對話框是。他們不能像關閉正常表格一樣關閉。你也不能簡單地檢測它們。 – Martin 2012-04-17 09:28:22

+0

爲什麼你需要在沒有用戶交互的情況下關閉你的應用程序 - 這至少是不標準的。如果打印對話框沒有顯示(即我正在使用應用程序)並且有更新呼叫進入,會發生什麼情況?應用程序剛剛消失在你的眼前? – 2012-04-17 12:24:50

回答

1

我沒有時間設計一個完整的答案,但這裏有一些提示。

一種解決方案might

  1. 迭代通過所有屬於你的VB6程序
  2. 找到的hWnd爲每一個
  3. 使用PostMessage的發送WM_CLOSE每一個頂層窗口。

Karl Peterson有一個article代碼,它遍歷屬於當前線程的所有窗口並確定它們的hWnd。

帶上你的斧頭! :)

+0

我已經在尋找依賴於Hwnd和父窗口以及其他東西的解決方案。我以前沒有看到這個選項。我會試一試,稍後再報告。 – Martin 2012-04-18 08:30:51

+0

太好了。如果您想出一個體面的解決方案,請將其作爲答案發回。 – MarkJ 2012-04-18 11:37:54

+0

我嘗試了EnumThreadWindows函數,但沒有得到預期的結果。我繼續自己的領導,似乎工作。但我仍然希望有更好的解決方案。 – Martin 2012-04-18 11:55:00

1

半回答我自己的問題。我仍在尋找更好的解決方案,但迄今爲止這已經成功了。

我使用EnumWindows連同IsWindowVisible得到Hwnd 所有可見窗口。然後我用GetAncestor從祖先的形式(開場表格)獲得Hwnd。我通過遍歷所有表單來檢查該祖先Hwnd是否屬於我自己的應用程序。如果它屬於我的應用程序,我用PostMessage的WM_CLOSE關閉窗口。

這可能不是最好的解決方案,因爲我需要遍歷所有正在運行的應用程序打開的所有窗口。如果有人有更好的解決方案,那麼我喜歡聽到它。簡單地給我的應用程序打開窗口的Hwnd可能會加快速度。

1

作爲一個巨大的黑客,你可以嘗試撥打Sendkeys "{esc}",直到你的表單得到按鍵事件。

+1

+1。當我開心的時候,我正抓着我的鼻子! – MarkJ 2012-04-18 17:23:02

1

另一個opiton只是阻止關閉,直到關閉對話框(你知道當你顯示它,當它返回,所以一個簡單的標誌會這樣做)。

+0

整個技巧就是 - 當發佈更新時,用戶有幾分鐘的時間來自行關閉應用程序。如果這不是因爲他們沒有坐在電腦後面而發生的,那麼應用程序需要自動關機。對話框仍然可以打開,所以我需要處理它們。 – Martin 2012-04-19 08:20:29

相關問題