2012-03-31 83 views
2

我試圖最小化標題位於string p(由用戶在運行時指定)的窗口。窗口保證是主窗口,因爲用戶只能從主窗口中選擇。我已經嘗試過showCmd,flags和這兩者的混合,但是無論窗口是否最小化,我都會顯示對話框,指出"Minimizing"。我該如何解決它?如何最小化/恢復c中的窗口#

private void button1_Click(object sender, EventArgs e) 
{ 
    foreach (Process proc in Process.GetProcesses()) 
    { 
     if (proc.MainWindowTitle.Contains(p)) 
     { 
      IntPtr handle = proc.Handle; 
      Program.WINDOWPLACEMENT wp = new Program.WINDOWPLACEMENT(); 
      Program.GetWindowPlacement(handle, ref wp); 
      if ((wp.showCmd & 2) == 2) 
      { 
       wp.showCmd = 9; 
       MessageBox.Show("Restoring"); 
      } 
      else 
      { 
       wp.showCmd = 2; 
       MessageBox.Show("Minimizing"); 
      } 
      wp.length = Marshal.SizeOf(wp); 
      Program.SetWindowPlacement(handle, ref wp); 
      break; 
     } 
    } 

} 

我正在使用爲P -

string p; 
PictureBox i; 
bool windowShowing = false; 
bool minimized = false; 
public TaskbarItem(string window) 
{ 
    InitializeComponent(); 
    p = window; 
    button1.Text = window; 
} 

得到窗口:

class WindowEnumerator 
{ 
    public delegate bool EnumDelegate(IntPtr hWnd, int lParam); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool IsWindowVisible(IntPtr hWnd); 

    [DllImport("user32.dll", EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount); 

    [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam); 

    [DllImport("user32")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i); 


    public static List<IntPtr> GetChildWindows(IntPtr parent) 
    { 
     List<IntPtr> result = new List<IntPtr>(); 
     GCHandle listHandle = GCHandle.Alloc(result); 
     try 
     { 
      EnumWindowProc childProc = new EnumWindowProc(EnumWindow); 
      EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); 
     } 
     finally 
     { 
      if (listHandle.IsAllocated) 
       listHandle.Free(); 
     } 
     return result; 
    } 
    public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter); 

    public static LinkedList<IntPtr> EnumMethod2(bool includeChild) 
    { 
     LinkedList<IntPtr> pss = new LinkedList<IntPtr>(); 
     Process[] ps = Process.GetProcesses(); 
     foreach (Process p in ps) 
     { 
      string s = p.MainWindowTitle; 
      if (s.Equals("") || s.Equals("Mod_Taskbar")) 
      { 
       continue; 
      } 
      LinkedListNode<IntPtr> node = new LinkedListNode<IntPtr>(p.MainWindowHandle); 
      pss.AddLast(node); 
      if (includeChild){ 
       List<IntPtr> l = GetChildWindows(p.MainWindowHandle); 
       foreach (IntPtr i in l) 
       { 
        StringBuilder stb = new StringBuilder(255); 
        WindowEnumerator.GetWindowText(i, stb, 255); 
        if (stb.ToString().StartsWith("Address:") || stb.ToString().EndsWith("View") || stb.ToString().EndsWith("Control") || 
         stb.ToString().EndsWith("Bar") || stb.ToString().EndsWith("bar") || stb.ToString().Contains("Host")) 
        { 
         continue; 
        } 
        if (Vars.excludes.Contains(stb.ToString())) 
        { 
         continue; 
        } 
        pss.AddAfter(node, i); 
       } 
      } 
     } 
     return pss; 
    } 
    private static bool EnumWindow(IntPtr handle, IntPtr pointer) 
    { 
     GCHandle gch = GCHandle.FromIntPtr(pointer); 
     List<IntPtr> list = gch.Target as List<IntPtr>; 
     list.Add(handle); 
     return true; 
    } 
} 

和:

private void LoadWindows(object sender, EventArgs e) 
{ 
    panel1.Controls.Clear(); 
    foreach (IntPtr p in WindowEnumerator.EnumMethod2(false)) 
    { 
     StringBuilder stb = new StringBuilder(255); 
     WindowEnumerator.GetWindowText(p, stb, 255); 
     TaskbarItem t = new TaskbarItem(stb.ToString()); 
     t.Dock = DockStyle.Left; 
     panel1.Controls.Add(t); 
    } 
} 

回答

4

你檢查什麼價值的WP .showCmd有?

嘗試使用此代碼:

foreach (Process proc in Process.GetProcesses()) 
{ 
    if (proc.MainWindowTitle.Contains(p)) 
    { 
     IntPtr handle = proc.Handle; 
     Program.WINDOWPLACEMENT wp = new Program.WINDOWPLACEMENT(); 
     Program.GetWindowPlacement(handle, ref wp); 
     if ((wp.showCmd & 2) == 2) 
     { 
      wp.showCmd = 9; 
      MessageBox.Show("Restoring"); 
     } 
     else 
     { 
      wp.showCmd = 2; 
      MessageBox.Show("Minimizing"); 
     } 
     wp.length = Marshal.SizeOf(wp); 
     Program.SetWindowPlacement(handle, ref wp); 
     break; 
    } 
} 
+0

謝謝,現在我知道,它捕獲的iTunes窗口調用,而不是任務欄HelperMsgListenerWnd - 微軟的Visual Studio。對此有何幫助? – m12 2012-04-01 00:09:30

+0

你是以「p」傳遞什麼?我需要更多信息 – aKzenT 2012-04-01 00:12:40

+0

我更新了問題 – m12 2012-04-01 00:21:59

0
this.WindowState = FormWindowState.Minimized;