2011-02-01 36 views
5

Tôi đang cố gắng để mang lại một cửa sổ foreground. Tôi đang sử dụng mã này. Nhưng nó không hoạt động. Ai đó có thể vui lòng giúp đỡ?Làm thế nào để mang một tiền cảnh cửa sổ bằng cách sử dụng C#?

ShowWindowAsync(wnd.hWnd, SW_SHOW); 

SetForegroundWindow(wnd.hWnd); 
// Code from Karl E. Peterson, www.mvps.org/vb/sample.htm 
// Converted to Delphi by Ray Lischner 
// Published in The Delphi Magazine 55, page 16 
// Converted to C# by Kevin Gale 
IntPtr foregroundWindow = GetForegroundWindow(); 
IntPtr Dummy = IntPtr.Zero; 

uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindow, Dummy); 
uint thisThreadId = GetWindowThreadProcessId(wnd.hWnd, Dummy); 

if (AttachThreadInput(thisThreadId, foregroundThreadId, true)) 
{ 
    BringWindowToTop(wnd.hWnd); // IE 5.5 related hack 
    SetForegroundWindow(wnd.hWnd); 
    AttachThreadInput(thisThreadId, foregroundThreadId, false); 
} 

if (GetForegroundWindow() != wnd.hWnd) 
{ 
    // Code by Daniel P. Stasinski 
    // Converted to C# by Kevin Gale 
    IntPtr Timeout = IntPtr.Zero; 
    SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, Timeout, 0); 
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Dummy, SPIF_SENDCHANGE); 
    BringWindowToTop(wnd.hWnd); // IE 5.5 related hack 
    SetForegroundWindow(wnd.hWnd); 
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Timeout, SPIF_SENDCHANGE); 
} 

Mã Explained

Làm một cửa sổ cửa sổ foreground đòi hỏi nhiều hơn là chỉ gọi API SetForegroundWindow. Bạn phải trước tiên xác định chủ đề tiền cảnh và đính kèm nó vào cửa sổ của bạn, sử dụng AttachThreadInput, sau đó gọi SetForegroundWindow. Bằng cách đó, họ có thể trạng thái nhập chia sẻ.

Trước tiên, tôi gọi GetForegroundWindow để lấy tay cầm của cửa sổ tiền cảnh hiện tại. Sau đó, một vài cuộc gọi đến GetWindowThreadProcessId truy xuất các chủ đề được liên kết với cửa sổ tiền cảnh hiện tại và cửa sổ I muốn mang đến nền trước. Nếu các chủ đề này giống nhau, hãy gọi đơn giản tới SetForegroundWindow là tất cả là cần thiết. Nếu không, chủ đề tiền cảnh được gắn vào cửa sổ mà tôi sẽ đưa đến trước và tách ra khỏi cửa sổ tiền cảnh hiện tại. API AttachThreadInput xử lý việc này.

Nội dung Lấy từ here Cảm ơn.

+2

Mã số ác, bỏ phiếu để đóng. –

+0

Tôi cũng không thể hiểu được mã. Nhưng tôi nghĩ rằng chủ đề sẽ không được đóng lại. Im đang đợi các giải pháp có thể có –

+0

@Nikil, mayb chỉ giữ tiêu đề và xóa (quên) mã đó? –

Trả lời

1

Bạn nên sử dụng SetForegroundWindow. Ngoài ra nó có thể là thú vị cho bạn C# Force Form Focus

0

Sẽ ngắn gọn: Form.BringToFront()

+0

Đây là các biểu mẫu trong ứng dụng của riêng bạn, không phải bất kỳ ứng dụng nào đang chạy –

11

Tôi đã sử dụng phương pháp này trước:

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

    Process[] processes = Process.GetProcessesByName("processname"); 
    SetForegroundWindow(processes[0].MainWindowHandle); 

Thông tin thêm: http://pinvoke.net/default.aspx/user32.SetForegroundWindow

+0

Bạn cũng cần phải khôi phục biểu mẫu nếu nó được thu nhỏ. –

0

Vì Windows 7 các tính năng này không hoạt động khá tốt. Nếu có một ứng dụng như Excel ở phía trước ứng dụng mà bạn muốn mang đến trước thì Windows 7 sẽ chặn nó và nhấp nháy cửa sổ. Bạn có thể thiết lập một thiết lập thời gian chờ đăng ký ForegroundLockTimeout = 0 trong HKEY_CURRENT_USER \ Control Panel \ Desktop nhưng chúng được gọi là lấy cắp tiêu điểm. Để thiết lập hành vi như thế nào XP "nên" hành xử và sẽ hành xử trong Windows 7 theo mặc định, bạn có thể tạo/thiết lập giá trị 0x00030D40 (200000ms). Tôi muốn biết giải pháp ưu tiên cho các ứng dụng Windows đáng tin cậy là gì. ví dụ. Nếu tôi tin tưởng ứng dụng B để mất tập trung khi tôi nhấp đúp chuột một cái gì đó trong ứng dụng A, và một số ứng dụng khác được che khuất cửa sổ của ứng dụng B.

6

Mã này phục hồi và đặt trọng tâm vào một cửa sổ:

[DllImport("User32.dll")] 
    static extern int SetForegroundWindow(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    internal static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam); 
    static Int32 WM_SYSCOMMAND = 0x0112; 
    static Int32 SC_RESTORE = 0xF120; 

Và sử dụng nó như sau:

var proc = Process.GetProcessesByName("YourProgram").FirstOrDefault(); 

    if (proc != null) 
    { 
     var pointer = proc.MainWindowHandle; 

     SetForegroundWindow(pointer); 
     SendMessage(pointer, WM_SYSCOMMAND, SC_RESTORE, 0); 
    } 
2

Để SetForegroundWindow hoạt động ổn định, bạn phải meet a few criteria.Đầu tiên là quá trình của bạn sẽ chạy lệnh phải ở phía trước. Chỉ có tiến trình tiền cảnh mới có thể tạo ra một tiến trình khác. Để làm cho quá trình của bạn được đặt trước trước, bạn phải mang cửa sổ chính về phía trước, nếu không. Bạn giảm thiểu nó đầu tiên và sau đó SetForegroundWindow nó, để làm cho nó foreground. Bây giờ tìm thấy quá trình mục tiêu và mang nó vào phía trước

Các bước thực hiện

I've got an example, mặc dù đó là trường hợp sử dụng hơi khác.

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