2010-04-06 29 views
5

Có cách nào để ghi lại tất cả các nhấp chuột trong một ứng dụng Win Forms không? Tôi muốn chặn các nhấp chuột và ghi lại hành động và tên của kiểm soát gây ra nó.Biểu mẫu giành chiến thắng, đăng nhập tất cả các nhấp chuột?

Điều này có khả thi không?

Xin cảm ơn trước.

CẬP NHẬT: Tôi đang tìm một giải pháp ứng dụng rộng, không có cách nào để thêm người nghe vào hàng đợi sự kiện của cửa sổ (hoặc nó được gọi là gì)?

+0

tạo một lớp mới có nguồn gốc từ lớp mẫu, sau đó đặt mã của David Fox trong lớp mới của bạn. trên biểu mẫu người tiêu dùng, kế thừa từ lớp mới của bạn thay vì Biểu mẫu mặc định. public class Form1: MagicForm –

Trả lời

5

Bạn có thể thực hiện việc này bằng cách có biểu mẫu chính của ứng dụng triển khai giao diện IMessageFilter. Bạn có thể hiển thị các thông báo cửa sổ mà nó nhận được và tìm kiếm các nhấp chuột. Ví dụ:

public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     this.FormClosed += (o, e) => Application.RemoveMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x201 || m.Msg == 0x203) { // Trap left click + double-click 
     string name = "Unknown"; 
     Control ctl = Control.FromHandle(m.HWnd); 
     if (ctl != null) name = ctl.Name; 
     Point pos = new Point(m.LParam.ToInt32()); 
     Console.WriteLine("Click {0} at {1}", name, pos); 
     } 
     return false; 
    } 
    } 

Lưu ý rằng đây đăng tất cả nhấp chuột trong bất kỳ cửa sổ của ứng dụng của bạn.

+0

Hoàn hảo! Cảm ơn bạn. Tôi đã nhìn thấy Application.AddMessageFilter nhưng không có ý tưởng làm thế nào để có được một điều khiển từ một xử lý. – chillitom

0

Vâng, bạn có thể đăng ký sự kiện Click hoặc MouseDown của mọi điều khiển trên biểu mẫu.

+0

rõ ràng, nhưng tôi đang tìm một cái gì đó mà chăm sóc này như là một mối quan tâm cắt chéo. Trong một ứng dụng lớn, phương pháp này chỉ là không khả thi. – chillitom

0

MouseEventArgs sử dụng như thế này:

private void Form_MouseDown(object sender, System.WinForms.MouseEventArgs e) 
{ 
switch (e.Button) 
{ 
    case MouseButtons.Left: 
    MessageBox.Show(this,"Left Button Click"); 
    break; 
    case MouseButtons.Right: 
    MessageBox.Show(this,"Right Button Click"); 
    break; 
    case MouseButtons.Middle: 
    break; 
    default: 
    break; 
} 

EventLog.WriteEntry("source", e.X.ToString() + " " + e.Y.ToString()); //or your own Log function 

} 
1

Bạn có thể sử dụng Spy++ hoặc WinSpy++ để đạt được điều này.

alt text http://www.catch22.net/sites/default/files/images/winspy1.img_assist_custom.jpg

Nhưng tôi không chắc bạn có thể tự mình đạt được điều tương tự như thế nào. Nếu có thể bạn cần thực hiện nó thông qua một hook Windows API mức thấp hoặc một trình xử lý tin nhắn cho phép bạn truy cập vào tất cả các thông báo trong hàng đợi ứng dụng của bạn.

0

Dự án thử nghiệm NunitForms có ứng dụng ghi âm để theo dõi sự kiện này và nhiều sự kiện khác. Mã rất thông minh và đáng xem. Đó là một dự án của ThoughtWorks.

Đó là giải pháp cuộn Royce dù! ...

Hãy thử một cách đệ quy đi bộ bộ sưu tập Controls của hình thức và subscibe sự kiện dựa trên loại.

PK :-)

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