2012-03-31 9 views
2

런타임에 사용자가 지정한 string p에있는 제목으로 창을 최소화하려고합니다. 사용자는 메인 윈도우에서만 선택할 수 있기 때문에 윈도우는 메인 윈도우로 보장됩니다. showCmd, 플래그 및 두 가지를 혼합하여 시도했지만 매번 창이 최소화되었는지 여부에 관계없이 "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; 
     } 
    } 

} 

나는 페이지로 사용하고 무엇 - 창 얻으려면

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

덕분에, 지금은 그것이 아이튠즈 창 대신 작업 표시 줄의 HelperMsgListenerWnd이라고 캡처 한 것을 알고 - 마이크로 소프트 비주얼 스튜디오. 이것에 대한 도움이 필요하십니까? – m12

+0

"p"로 무엇을 전달합니까? 더 많은 정보가 필요합니다 – aKzenT

+0

나는 – m12

0
this.WindowState = FormWindowState.Minimized;