2013-03-26 37 views
6

Tôi muốn viết ứng dụng C# sẽ chuyển đổi giữa một số ứng dụng đang chạy. Nó nên làm các chức năng chính xác như Alt + Tab trong cửa sổ. Tôi sử dụng chức năng SetForegroundWindow() từ Windows API, nhưng nó không hoạt động tốt nếu ứng dụng được thu nhỏ trên thanh tác vụ của cửa sổ. Vì vậy, tôi đã thêm ShowWindow() chức năng, nhưng có một vấn đề mà tôi không thể hiển thị cửa sổ ở kích thước ban đầu mà người dùng thiết lập.Chuyển ứng dụng trong C# như trình quản lý tác vụ

[DllImport("user32.dll")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

Ví dụ: Tôi phóng to cửa sổ, sau đó tôi thu nhỏ cửa sổ vào thanh tác vụ. Khi tôi gọi:

ShowWindow(processWindowHandle, ShowWindowCmd.SW_NORMAL); 
WindowsApi.SetForegroundWindow(processWindowHandle); 

Cửa sổ không được phóng to. Tôi đã thử chơi với tham số ShowWindowCmd.SW_NORMAL nhưng với cùng một kết quả.

+2

bạn đã thử SW_RESTORE? – David

+0

Có, tôi đã thử SW_RESTORE. Các ứng dụng được tối đa hóa và sau đó được tối thiểu hóa sau đó hiển thị NOT tối đa (như mong đợi). Nó được hiển thị dưới dạng cửa sổ có kích thước thấp hơn kích thước tối đa của màn hình. –

+0

Tôi không muốn tối đa hóa cửa sổ mỗi lần. Tôi muốn hiển thị cửa sổ trong cùng một trạng thái đã được cho tôi ẩn cửa sổ với một số khác hoặc befor tôi tối thiểu hóa nó vào thanh tác vụ ... –

Trả lời

2

Tôi đã thực hiện điều này trước đây, bạn muốn có danh sách mọi thứ đang mở, giảm thiểu mọi thứ và sau đó lặp lại thông qua đó so sánh từng chương trình với chương trình bạn muốn khôi phục rồi khôi phục lại. Bạn cần một cách để xác định rằng một cửa sổ bạn muốn khôi phục, tôi đã sử dụng MainWindowTitle như tôi đã kiểm soát môi trường, và do đó có thể đảm bảo rằng mỗi MainWindowTitle sẽ là duy nhất, bạn có thể không có sự sang trọng đó.

Mã tôi đã sử dụng trong quá khứ cho điều này là dưới đây, nó làm việc tốt:

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

void SwitchDatabase(string mainWindowTitle) 
{ 
     try 
     { 
      bool launched = false; 

      Process[] processList = Process.GetProcesses(); 

      foreach (Process theProcess in processList) 
      { 
       ShowWindow(theProcess.MainWindowHandle, 2); 
      } 

      foreach (Process theProcess in processList) 
      { 
       if (theProcess.MainWindowTitle.ToUpper().Contains(mainWindowTitle.ToUpper())) 
       { 
        ShowWindow(theProcess.MainWindowHandle, 9); 
        launched = true; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ThrowStandardException(ex); 
     } 
} 
+0

Hmm. Bạn nói đúng, tôi nghĩ vậy. Chỉ có một nhược điểm nhỏ. Nếu tôi không tối giản hóa cửa sổ của mình và gọi mã này, cửa sổ tối đa được khôi phục vào kích thước KHÔNG tối thiểu hóa và KHÔNG được tối đa hóa. Có lẽ phải có mã như thế này: 'if (tối thiểu) { ShowWindow (theProcess.MainWindowHandle, 9); } else { SetForegroundWindow (processWindowHandle); } ' –

Các vấn đề liên quan