2011-04-26 84 views
2

當我點擊一個ESRI COM工具欄項時,它產生一個窗口 - 它看起來像一個Winform。由於我沒有直接產生窗口,所以我不能只對它做一個Object.Close()。我可以使用什麼技術刪除我的應用程序產生的窗口,但我沒有對象引用?如何殺死一個窗口?

+2

我很好奇,什麼ESRI的COM工具欄? – 2011-04-26 19:42:23

+0

@Gabriel我有一個WindowsFormHost的WPF應用程序,在這個WindowsFormHost是一個AxToolbarControl。它是一個ESRI.ArcGIS.Controls.AxToolbarControl它實現IToolbar - http://resources.esri.com/help/9.3/arcgisengine/java/api/arcobjects/com/esri/arcgis/controls/IToolbarControl.html – 0x4f3759df 2011-04-26 19:49:01

回答

3

我認爲最簡單的方法是使用p/invoke。

最簡單的方法: 使用FindWindow函數()函數來獲取和HWND爲窗口(在C#中的IntPtr的,你可以使用NativeWindow類的包裝 - http://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.aspx#Y114

一旦你的HWND你可以使用CloseWindow()關閉窗口或向使用SendMessage(youHWND,WM_CLOSE,IntPtr.Zero,IntPtr.Zero)的窗口發送消息(WM_CLOSE = 0x0010)。

如果你的窗口有一個父窗口(你可以使用spy ++來查找),你可以使用FindWindowEx()以更精確的方式找到你的窗口。

希望它有幫助!

祝你好運!

p.s.我們可以使用GetWindowThreadProcessId()來確保窗口屬於你的進程!爲了確保你不會意外地殺死另一個應用程序的窗口(如果你在沒有父窗口的情況下使用FindWindow或FindWindowEx),你可以使用GetWindowThreadProcessId()來確保窗口屬於你的進程!

+0

我也會檢查WinAPI代碼包爲.Net: http://archive.msdn.microsoft.com/WindowsAPICodePack/Release/ProjectReleases.aspx?ReleaseId=4906 它可能有你所需要的(從未使用過) – TCS 2011-04-26 19:52:44

2

假設你沒有窗口句柄,你可以互操作,以Win32和執行以下操作:

在一些方法調用:

CallBackPtr callback = WindowEnumeration; 
EnumWindows(callback, IntPtr.Zero); 

然後,它會調用下面找到窗口,關閉它,只需將<標題>替換爲描述性窗口的標題即可,以防止關閉不打算關閉的窗口。

private bool WindowEnumeration(IntPtr hwnd, IntPtr lParam) 
{ 
    _windowName.Clear(); 
    if (GetWindowText(hwnd, _windowName, _windowName.Capacity) != 0) 
    { 
     if (_windowName.ToString().Contains("<title>")) 
     { 
      PostMessage(window, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
     } 
    } 

    return true; 
} 

調用Win32的信息可以在MSDN中找到或pinvoke.net

+0

請不要不這樣做。不管它們來自哪裏,或者它們屬於哪個,所有頂層窗口的字幕僅包含*標題將收到一條「WM_CLOSE」消息。想象一下,如果「標題」是常見的事情會發生什麼,例如, 'Document'。考慮匹配整個標題,以及如果可能的話,也是窗口類。 – 2011-04-26 19:56:15

+0

@Hamidi - 我補充說明以提供一個描述性標題。我剛剛複製了一段我已經用於其他地方的代碼,其中有一個描述性窗口標題。在我的情況下,我確實嘗試了基於Spy ++來指定窗口類,但是由於某種原因它永遠找不到窗口。 – 2011-04-26 20:09:42