2011-05-12 36 views
1

我正在寫一個C#應用程序,它調用使用非託管代碼編寫的DLL內的函數。反正通過interop調用dll函數時有陷阱或者殺死一個彈出窗口嗎?

大多數情況下,調用都可以正常工作,被調用的函數會返回一個整數值,指定成功或一些錯誤代碼。但是,對於一些錯誤代碼,DLL似乎還會彈出一個消息框,提供關於錯誤的更多信息。

我無法知道這是否會發生給定的功能調用,而不是用這些消息框麻煩用戶,因爲有時我在批處理中調用這個函數幾千次我寧願沒有用戶必須按「確定」,因爲無論發生多少故障。

如果有任何方法可以確定在給定的調用之後顯示消息框,或者通常禁止或禁止在給定調用期間顯示任何窗口或窗體?這似乎不大可能,但我想我會問。

謝謝, 先生中號

回答

2

當你懷疑,你不會是能夠抑制從代碼的彈出窗口,你還沒有寫,除非有來電會爲你做一個具體的參數。消息框是否與特定的錯誤代碼相關聯?

有些程序可以監視你的電腦的特定窗口,當它們出現時點擊它們上的按鈕,雖然當然也需要用戶運行它,但這有點負擔。 [編輯:喬指出你可以在一個單獨的線程上自己做這件事。也是一種選擇。]

總有一些要與相關性問題時,必須權衡,你有什麼妥協可能需要你做出平衡依賴的實用性和必要性。

+1

您可以隨時以編程方式監視特定窗口並單擊它們上的按鈕。這是一個麻煩,但它會解決要求用戶運行其他應用程序的負擔。 – 2011-05-12 14:43:37

+0

是的,這是一個很好的觀點。編輯。 – dlev 2011-05-12 14:45:57

+0

我曾考慮過這個想法,但希望有人會說,哦,只需將這個「supressstupidpopup」屬性添加到你的dllimport中,你就會好起來的。我認爲你們雖然有錢。我會拭目以待,看看有人提出了一些神奇的東西。如果沒有,我已經寫信給圖書館的維護人員,但我並沒有屏住呼吸:) – 2011-05-12 14:57:16

1

如果感覺需要這樣做,真的沒有辦法阻止任意(非託管)DLL彈出UI。

雖然一個醜陋的工作是試圖在彈出窗口後立即關閉窗口。我會這樣做的方式是

  • 開始另一個線程。它的工作是記錄當前活動窗口的進程並關閉顯示的新窗口。
  • 請來電到DLL
  • 停止線程

這絕不是防彈的過程,但它可以幫助你解決這個問題。

+0

+1確認我的恐懼。對於那些引起我悲傷的事情,我覺得不滿意。 – 2011-05-12 15:00:50

2

調查低級別的Win API調用,他們可能會爲您提供解決方案。

例如,使用Spy ++可以顯示窗口名稱,然後您可以搜索並關閉。然後使用WINDOWS API標註...

using System.Runtime.InteropServices; 

    // Get a handle to an application window. 
    [DllImport("USER32.DLL", CharSet = CharSet.Unicode)] 
    private static extern IntPtr FindWindow(string lpClassName, 
     string lpWindowName); 

    // Activate an application window. 
    [DllImport("USER32.DLL")] 
    private static extern bool SetForegroundWindow(IntPtr hWnd); 

然後在後臺線程中編寫一個查找這些窗口並關閉它們的進程。

 //Some PsuedoCode, note loop should have a cancel condition! 
     while (true) 
     { 
      //Get a handle. 
      handle = FindWindow(windowClassName, windowName); 

      //We found the window, close it 
      if (handle != IntPtr.Zero) 
      { 
       //Send Close Command 
       SetForegroundWindow(handle); 
       SendKeys.SendWait("%{F4}"); 
      } 

      //Wait 200ms seconds before trying again 
      System.Threading.Thread.Sleep(200); 
     } 

你可能可以在你的應用程序中做一些這樣的hackish解決方案。

請注意,您必須將windowClassName(s)和windowName(s)存儲在某種配置文件中,或將它們硬編碼到您的應用程序中。

+0

看起來很有希望。對我來說幸運的是,我剛剛聽到擁有這個DLL的那個人的回信。雖然他沒有解決問題或給我一個解決方法,但他指出我有一個非常類似但更新的DLL,沒有怪異。儘管如此,再次感謝您的回覆。無論如何,我可能會看看Spy ++的樂趣。 – 2011-05-13 07:23:51

+0

如果你可以讓DLL的所有者用某種參數或選項來抑制所有的用戶消息,那就太棒了。祝你好運。 – 2011-05-13 18:23:49

0

從Windows服務中運行此代碼是否實用?

服務不允許顯示GUI(您曾經可以選擇允許服務顯示GUI,但MS已經逐步停止)。我不確定,但我認爲當你從非交互式服務調用它們時,對MessageBox()等的調用可能會立即返回。