2009-11-07 75 views
3

我有一個使用SendMessage函數PInvoke的方法來發送一個「關閉窗口」消息(WM_CLOSE/16),以不同的Windows應用程序之外C#應用程序。這除了當有問題的窗口是一個Windows資源管理器窗口的偉大工程。我沒有得到一個例外,但窗口不關閉。無法使用的PInvoke發送WM_CLOSE到Windows資源管理器窗口

下面是簽名:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
    internal static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

是否有不同的消息,我需要發送到Windows資源管理器窗口?或者完成這個的另一種方式?

回答

12

的替代解決方案是使用PostMessage的贏API調用來代替SendMessage函數,下面是這對我來說工作得很好的例子(我用winXP的SP3):PostMessage的和SendMessage函數的API之間

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
[DllImport("user32.Dll")] 
public static extern int PostMessage(IntPtr hWnd, UInt32 msg, int wParam, int lParam); 

private const UInt32 WM_CLOSE   = 0x0010; 

... 

    IntPtr hWnd = FindWindow("ExploreWClass", null); 
    if (hWnd.ToInt32()!=0) PostMessage(hWnd, WM_CLOSE, 0, 0); 

差異調用描述如下:http://msdn.microsoft.com/en-us/magazine/cc301431.aspx

+1

謝謝,這個完美的作品。信息鏈接也是如此。 – 2009-11-09 03:23:56

+1

感謝。簡短明瞭。而在Silvelight :) – 2013-08-05 14:46:40

+0

神奇的工作! [DestroyWindow](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632682%28v=vs.85%29.aspx)的絕佳替代方案,它只能在創建目標的相同線程上工作窗口在第一個地方。 – 2015-02-02 02:07:06

相關問題