2010-04-14 24 views
31

Chúng tôi chỉ muốn một phiên bản ứng dụng của chúng tôi chạy cùng một lúc. Vì vậy, khi khởi động, có vẻ như ứng dụng đang chạy và nếu ứng dụng đang chạy, ứng dụng sẽ gọi SetForegroundWindow trên Cửa sổ chính.Mang một quy trình khác Cửa sổ lên nền trước khi nó có ShowInTaskbar = false

này là tất cả tốt và tốt ... cho hầu hết các phần ..

Khi ứng dụng của chúng tôi bắt đầu lên nó sẽ hiển thị một màn hình Splash và một hình thức Logon. Cả hai biểu mẫu này đều có ShowInTaskBar = false.

Vì lý do này, nếu bạn cố gắng khởi động một bản sao ứng dụng khác khi biểu mẫu Đăng nhập hiển thị, biểu mẫu Đăng nhập không được đưa đến trước!

Đặc biệt khi người dùng không thể thấy bất kỳ thứ gì trong thanh tác vụ, tất cả những gì họ thấy là ứng dụng là duff và không thể bắt đầu. Không có dấu hiệu nào cho thấy có một cá thể khác đang chạy.

Có cách nào xung quanh vấn đề này không?

+0

Câu hỏi: không thiết lập thuộc tính của mẫu Logon Chủ đầu tư không giải quyết này hay không nó không có hiệu lực? – Asher

Trả lời

41

Vâng, mã ở đây. Ngay cả khi ShowInTaskBarfalse, bạn sẽ có thể đưa nó lên phía trước.

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)] 
    public static extern IntPtr FindWindow(String lpClassName, String lpWindowName); 

    [DllImport("USER32.DLL")] 
    public static extern bool SetForegroundWindow(IntPtr hWnd); 

    public static void bringToFront(string title) { 
     // Get a handle to the Calculator application. 
     IntPtr handle = FindWindow(null, title); 

     // Verify that Calculator is a running process. 
     if (handle == IntPtr.Zero) { 
      return; 
     } 

     // Make Calculator the foreground application 
     SetForegroundWindow(handle); 
    } 

Lưu ý: bạn nên sử dụng FindWindow lớp của hình thức và không theo tên như các hình thức màn hình đôi khi không có tiêu đề hoặc thậm chí các ControlBox. Sử dụng Spy ++ để đào sâu hơn.

Sử dụng FindWindow khi giật gân. Tôi nghĩ rằng đây là những gì bạn muốn làm - mang lại cho màn hình giật gân ở phía trước trong khi tải các hình thức chính.

+0

Tôi đã thực hiện cuộc gọi System.Diagnostics.Process.GetProcessesByName để nhận quy trình và sau đó gọi SetForegroundWindow trên process.MainWindowHandle. Không có ShowInTaskbar, không có MainWindowHandle. FindWindow là một cách hay để giải quyết vấn đề này. Cảm ơn! –

+0

Vì vậy, nhiều cách để làm điều này nhưng đây là người duy nhất làm việc cho tôi! – Lee

0
FindWindow(null, title); 

Sẽ tìm thấy cửa sổ đầu tiên khớp với truy vấn. Điều này có thể dẫn đến hành vi không mong muốn nếu một cửa sổ khác sử dụng cùng một tiêu đề.

Mặc dù cơ hội xảy ra điều này có thể có vẻ hiếm hoặc không thể (ứng dụng đơn lẻ) điều này có thể dễ dàng xảy ra. Cửa sổ thám hiểm ví dụ sử dụng tên của thư mục được chọn làm tiêu đề cửa sổ (mặc dù vô hình). Bây giờ nếu tiêu đề cửa sổ là một thuật ngữ chung hoặc khớp với tên của thư mục ứng dụng thì đây có thể là một vấn đề.

16

Tôi nghĩ rằng đây là giải pháp tốt hơn bởi vì khôi phục từ trạng thái giảm thiểu:

public static class WindowHelper 
{ 
    public static void BringProcessToFront(Process process) 
    { 
     IntPtr handle = process.MainWindowHandle; 
     if (IsIconic(handle)) 
     { 
      ShowWindow(handle, SW_RESTORE); 
     } 

     SetForegroundWindow(handle); 
    } 

    const int SW_RESTORE = 9; 

    [System.Runtime.InteropServices.DllImport("User32.dll")] 
    private static extern bool SetForegroundWindow(IntPtr handle); 
    [System.Runtime.InteropServices.DllImport("User32.dll")] 
    private static extern bool ShowWindow(IntPtr handle, int nCmdShow); 
    [System.Runtime.InteropServices.DllImport("User32.dll")] 
    private static extern bool IsIconic(IntPtr handle); 
} 

đơn giản gọi:

WindowHelper.BringProcessToFront(process); 
+1

Upvoting câu trả lời này kể từ khi nó phục hồi từ một trạng thái giảm thiểu là tốt. – oppassum

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