2009-06-17 6 views
6

जब एक आवेदन के मुख्य Form - एक Application.Run() के लिए पारित किया -Form.ShowInTaskBar/Process.MainWindowHandle

this.ShowInTaskBar = false; 

तो, Process कि आवेदन का प्रतिनिधित्व करने का एक उदाहरण है, एक 0 की MainWindowHandle है जिसका अर्थ है कि Process.CloseMainWindow() नहीं है काम।

मैं इसके आसपास कैसे हो सकता हूं? मुझे Process उदाहरण के माध्यम से Form को साफ़ रूप से बंद करने की आवश्यकता है।

उत्तर

2

मुझे Win32 सामान पर वापस जाने और विंडो खिताब का उपयोग करके इसे करने का एक वैकल्पिक तरीका मिला। यह गन्दा है, लेकिन यह मेरी स्थिति के लिए काम करता है।

उदाहरण में एक एप्लिकेशन इंस्टेंस का संदर्भ मेनू उस एप्लिकेशन के सभी उदाहरण बंद कर रहा है।

[DllImport("user32.dll")] 
public static extern int EnumWindows(EnumWindowsCallback x, int y); 
public delegate bool EnumWindowsCallback(int hwnd, int lParam); 
[DllImport("user32.dll")] 
public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount); 
[DllImport("user32.dll")] 
public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, int lParam); 
private void ContextMenu_Quit_All(object sender, EventArgs ea) 
{ 
    EnumWindowsCallback itemHandler = (hwnd, lParam) => 
    { 
     StringBuilder sb = new StringBuilder(1024); 
     GetWindowText(hwnd, sb, sb.Capacity); 

     if ((sb.ToString() == MainWindow.APP_WINDOW_TITLE) && 
      (hwnd != mainWindow.Handle.ToInt32())) // Don't close self yet 
     { 
      PostMessage(new IntPtr(hwnd), /*WM_CLOSE*/0x0010, 0, 0); 
     } 

     // Continue enumerating windows. There may be more instances to close. 
     return true; 
    }; 

    EnumWindows(itemHandler, 0); 
    // Close self .. 
}