當我點擊一個ESRI COM工具欄項時,它產生一個窗口 - 它看起來像一個Winform。由於我沒有直接產生窗口,所以我不能只對它做一個Object.Close()。我可以使用什麼技術刪除我的應用程序產生的窗口,但我沒有對象引用?如何殺死一個窗口?
回答
我認爲最簡單的方法是使用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()來確保窗口屬於你的進程!
我也會檢查WinAPI代碼包爲.Net: http://archive.msdn.microsoft.com/WindowsAPICodePack/Release/ProjectReleases.aspx?ReleaseId=4906 它可能有你所需要的(從未使用過) – TCS 2011-04-26 19:52:44
假設你沒有窗口句柄,你可以互操作,以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
請不要不這樣做。不管它們來自哪裏,或者它們屬於哪個,所有頂層窗口的字幕僅包含*標題將收到一條「WM_CLOSE」消息。想象一下,如果「標題」是常見的事情會發生什麼,例如, 'Document'。考慮匹配整個標題,以及如果可能的話,也是窗口類。 – 2011-04-26 19:56:15
@Hamidi - 我補充說明以提供一個描述性標題。我剛剛複製了一段我已經用於其他地方的代碼,其中有一個描述性窗口標題。在我的情況下,我確實嘗試了基於Spy ++來指定窗口類,但是由於某種原因它永遠找不到窗口。 – 2011-04-26 20:09:42
- 1. 如何殺死彈出窗口?
- 2. C#:如何殺死一個單身窗口
- 3. 殺死Emacs子進程窗口10
- 4. 殺死窗口中的進程python 2.5
- 5. 如何殺死
- 6. 如何殺死OS X中的所有窗口進程
- 7. 如何在Windows中使用C#殺死警報窗口?
- 8. 如何殺死一個JavaScript腳本?
- 9. 如何殺死一個C#線程?
- 10. 如何殺死一個Activity和AsyncTask
- 11. 如何殺死一個線程?
- 12. 如何殺死一個活動
- 13. 如何殺死一個PHP會話?
- 14. 如何殺死一個進程?
- 15. 如何殺死一個BufferedInputStream .read()調用
- 16. 如何殺死一個C#進程?
- 17. 如何殺死一個web進程
- 18. VBScript - 創建並在一個隱藏的窗口中殺死一個進程?
- 19. 腳本顯示一個彈出窗口,然後殺死一個Windows進程
- 20. 如何殺死Ubuntu中的80端口
- 21. 殺死一個Windows服務
- 22. 殺死一個線程
- 23. 殺死一個mpi進程
- 24. 殺死一個cron作業
- 25. 如何殺死Excel
- 26. 如何殺死javaw.exe
- 27. 如何殺死RemoteActor?
- 28. 如何殺死SKScene
- 29. 如何殺死chromedriver
- 30. Hazelcast端口未被殺死
我很好奇,什麼ESRI的COM工具欄? – 2011-04-26 19:42:23
@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