2010-02-02 33 views
16

Tôi đang tìm cách tạo ứng dụng C# thay đổi nội dung theo ứng dụng hiện đang tập trung. Vì vậy, nếu người dùng đang sử dụng Firefox, ứng dụng của tôi sẽ biết điều đó. Tương tự cho Chrome, Visual Studio, TweetDeck, v.v.C#: Phát hiện ứng dụng nào có tiêu điểm

Điều này có thể thực hiện được không, và nếu vậy - làm cách nào để tôi đạt được nó?

Tôi có cảm giác tôi đang yêu cầu nhiều - nhưng đáng để thử.

Rất cám ơn trước.

+0

Sử dụng các giao diện khả năng tiếp cận. Đây chính xác là thứ họ đang làm. –

+0

Câu trả lời được chấp nhận cho câu hỏi này mở rộng theo nhận xét của @ RaymondChen: http://stackoverflow.com/questions/11711400/how-to-monitor-focus-changes – John

Trả lời

7

Hãy xem Application.AddMessageFilter và tìm WM_ACTIVATEAPP thư, thông báo này sẽ cho bạn biết thời điểm một ứng dụng được kích hoạt, tức là nhận được tiêu điểm.

+6

'Application.AddMessageFilter' chỉ chặn tin nhắn cho quá trình hiện tại, không phải các quá trình khác. – larsmoa

4

Grrr. Như thường là cách, tôi đã dành một chút thời gian Googling trước khi đăng câu hỏi này.

Khi tôi cuối cùng đăng câu hỏi, tìm kiếm Google tiếp theo của tôi đã tiết lộ câu trả lời.

Tôi chưa thử nghiệm, nhưng có vẻ như là GetForegroundWindow() là chìa khóa.

Thay vì tôi viết lại những gì đã viết, đây là một liên kết đến trang đó cung cấp thông tin:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

xin lỗi của thời gian của bất kỳ ai tôi đã lãng phí bằng cách hỏi một câu trả lời Googalable (?).

+1

AddMessageFilter có lợi thế là mã được quản lý hoàn toàn, GetForegroundWindows ít "nặng "(bạn kiểm tra các cửa sổ nền trước khi bạn cần, thay vì được thông báo cho mọi thay đổi ứng dụng) nhưng cần PInvoke. Bạn chỉ phải chọn ngay bây giờ;) – munissor

7

Điều này có thể được thực hiện bằng .NET thuần túy bằng cách sử dụng Automation framework là một phần của WPF. Thêm tài liệu tham khảo để UIAutomationClientUIAutomationTypes và sử dụng Automation.AddAutomationFocusChangedEventHandler, ví dụ .:

public class FocusMonitor 
{ 
    public FocusMonitor() 
    { 
     AutomationFocusChangedEventHandler focusHandler = OnFocusChanged; 
     Automation.AddAutomationFocusChangedEventHandler(focusHandler); 
    } 

    private void OnFocusChanged(object sender, AutomationFocusChangedEventArgs e) 
    { 
     AutomationElement focusedElement = sender as AutomationElement; 
     if (focusedElement != null) 
     { 
      int processId = focusedElement.Current.ProcessId; 
      using (Process process = Process.GetProcessById(processId)) 
      { 
       Debug.WriteLine(process.ProcessName); 
      } 
     } 
    } 
} 
Các vấn đề liên quan