2010-01-14 43 views
5

Tôi đang làm việc trên một ứng dụng cần phải có được xử lý cửa sổ hoạt động cuối cùng. Giả sử ứng dụng của tôi đang chạy sau đó tôi muốn có được xử lý cửa sổ hoạt động cuối cùng mà trước đây chỉ mở trước ứng dụng của tôi.Nhận cửa sổ hiện hoạt cuối cùng: Nhận cửa sổ hoạt động trước đó

@ EDIT1: Đây không phải là câu hỏi trùng lặp. Tôi cần phải có được xử lý của cửa sổ hoạt động cuối cùng không phải là cửa sổ hiện hành.

Trả lời

3

này tương tự như alternate SO question, tôi sẽ giả định bạn sẽ chỉ theo dõi các cửa sổ hoạt động và sau khi thay đổi sau đó bạn sẽ biết được hoạt động trước đó

Chỉnh sửa, điều này về cơ bản là mã được sao chép từ các câu hỏi tôi liên kết được tìm kiếm cho cửa sổ hiện tại đang hoạt động nhưng với logic để duy trì lastHandle và xác định khi bạn có một lastHandle mới. Đây không phải là triển khai được chứng minh, có thể biên dịch:

[DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 

static IntPtr lastHandle = IntPtr.Zero; 

//This will be called by your logic on when to check, I'm assuming you are using a Timer or similar technique. 
IntPtr GetLastActive() 
{ 
    IntPtr curHandle = GetForeGroundWindow(); 
    IntPtr retHandle = IntPtr.Zero; 

    if(curHandle != lastHandle) 
    { 
    //Keep previous for our check 
    retHandle = lastHandle; 

    //Always set last 
    lastHandle = curHandle; 

    if(retHandle != IntPtr.Zero) 
     return retHandle; 
    } 
} 
+0

Đây không phải là câu hỏi trùng lặp. Tôi cần phải có được xử lý của cửa sổ hoạt động cuối cùng không phải là cửa sổ hiện hành. –

+1

@Vinay, tôi đã nói tương tự. Câu hỏi đó đưa ra kiến ​​thức về cách sử dụng các API Win32, do đó tôi cho rằng trình xử lý được trả về bởi GetForegroundWindow() phù hợp cho việc sử dụng của bạn. Đây không phải là một bản sao nhưng chắc chắn tương tự hoặc một câu hỏi phụ trong một câu hỏi lớn hơn. Nếu bạn đang tìm cách thực hiện để sao chép và dán xin lỗi, nhưng tôi đã cho bạn logic trong câu trả lời của tôi ... theo dõi tất cả các cửa sổ ACTIVE, một khi bạn đã tìm thấy một cửa sổ ACTIVE thứ hai, bây giờ bạn có kiến ​​thức về trước đó. Tôi sẽ chỉnh sửa với một số mã psuedo. –

+0

Cảm ơn Jamie Altizer. –

1

Tôi cần điều tương tự của lần xử lý cuối cùng từ cửa sổ trước tôi đã mở. Câu trả lời từ Jamie Altizer đã gần, nhưng tôi đã sửa đổi nó để tránh ghi đè lên cửa sổ trước đó khi ứng dụng của tôi được tập trung lại. Đây là lớp học đầy đủ tôi đã thực hiện với bộ hẹn giờ và mọi thứ.

static class ProcessWatcher 
{ 
    public static void StartWatch() 
    { 
     _timer = new Timer(100); 
     _timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
     _timer.Start(); 
    } 

    static void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     setLastActive(); 
    } 

    [DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 

    public static IntPtr LastHandle 
    { 
     get 
     { 
      return _previousToLastHandle; 
     } 
    } 

    private static void setLastActive() 
    { 
     IntPtr currentHandle = GetForegroundWindow(); 
     if (currentHandle != _previousHandle) 
     { 
      _previousToLastHandle = _previousHandle; 
      _previousHandle = currentHandle; 
     } 
    } 

    private static Timer _timer; 
    private static IntPtr _previousHandle = IntPtr.Zero; 
    private static IntPtr _previousToLastHandle = IntPtr.Zero; 
} 
Các vấn đề liên quan