2013-04-02 38 views
8

Tôi đang cố chặn các nhấp chuột từ một chương trình khác. Tôi đang tạo plugin cho chương trình, phủ lên một biểu mẫu trong suốt trên chương trình và hiển thị thông tin bổ sung. Khi tôi nhấp vào phần trong suốt của biểu mẫu, tôi có thể nhấp vào những thứ trong chương trình main. Tôi không muốn điều này xảy ra (ít nhất không phải mọi lần - có một số phần mà bạn được phép nhấp vào và một số phần mà bạn không phải nhưng đây không phải là vấn đề).Chặn nhấp chuột từ chương trình khác

Cách tôi đang làm điều này bây giờ là sử dụng WH_MOUSE_LL, điều này có hiệu quả và tôi có thể giữ cho nhấp chuột không tham gia chương trình bằng cách trả lại giá trị khác 0 (http://msdn.microsoft.com/en-gb/library/windows/desktop/ms644988(v=vs.85).aspx).

Vấn đề là, điều này làm trễ chương trình chính của tôi, tôi không cần nhận thông báo cho tất cả các chuyển động của chuột, tôi chỉ muốn nhận thông báo nếu người dùng thực sự nhấp vào nội dung nào đó. Có cách nào tôi có thể giới hạn số WH_MOUSE_LL để nó chỉ kích hoạt khi nhấp chuột? (Thời gian trễ là không phải vì tính toán trong phương pháp MouseHookProc - nó hiện đang làm gì ngoại trừ gọi: CallNextHookEx(hHook, nCode, wParam, lParam).)

Tôi đã cố gắng để khắc phục điều này bằng cách sử dụng một cái móc toàn cầu (http://www.codeproject.com/Articles/18638/Using-Window-Messages-to-Implement-Global-System-H) mà móc WM_MOUSEACTIVATE thông điệp. Ý tưởng là chỉ kết nối số WH_MOUSE_LL khi tôi nhận được thông báo WM_MOUSEACTIVATE. Rất tiếc, WH_MOUSE_LL thông báo nhấp được gửi trước WM_MOUSEACTIVATE để thông báo này không hoạt động.

EDIT:

@Nanda đây là các mã proc:

public int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    return WindowUtility.CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

Như bạn thấy tôi không làm rất nhiều với nó atm, nhưng nó đã thua ...

@Cody Gray Tôi đã thực hiện một thử nghiệm rất nhỏ cho Biểu mẫu xử lý các thông báo:

public class Form1 : Form 
{ 
    private TrackBar m_Trackbar; 

    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    public Form1() 
    { 
     m_Trackbar = new System.Windows.Forms.TrackBar(); 
     m_Trackbar.LargeChange = 1; 
     m_Trackbar.Location = new System.Drawing.Point(5, 10); 
     m_Trackbar.Maximum = 100; 
     m_Trackbar.Size = new System.Drawing.Size(280, 40); 
     m_Trackbar.Value = 100; 
     this.Controls.Add(m_Trackbar); 

     m_Trackbar.Scroll += new System.EventHandler(this.m_TrackbarScroll); 
    } 


    private void m_TrackbarScroll(object sender, System.EventArgs e) 
    { 
     this.Opacity = ((Convert.ToDouble(m_Trackbar.Value))/100); 
    } 

    protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 
      case 0x201: //WM_LBUTTONDOWN 
       Console.WriteLine("MouseButton Down!"); 
       //I could copy the Message over to the MainProgram with this right? 
       //SendMessage(MainProgramHwnd, m.Msg, m.WParam, m.LParam); 
       //This will also only work on an opacity higher than 0. 
       break; 
     } 
     base.WndProc(ref m); 
    } 
} 

Khi bạn nói: "trả lại rằng nó trong suốt và để nó được chuyển đến cửa sổ bên dưới nó?" Tôi có thể làm điều này bằng cách sử dụng SendMessage và về cơ bản sao chép tin nhắn tôi nhận được trong phương pháp WndProc của tôi?

Để làm cho mọi việc phức tạp hơn, tôi cũng đang sử dụng biểu mẫu này http://www.codeproject.com/Articles/1822/Per-Pixel-Alpha-Blend-in-C. Theo hiểu biết của tôi, điều này cho phép tôi vẽ bitmap trên biểu mẫu Anti Aliasing dựa trên nền. Với biểu mẫu này dường như không có cách nào để đặt độ mờ, vì nó chỉ trong suốt mọi lúc. Có cách nào tốt hơn để vẽ bitmap trên Biểu mẫu không?

+1

Có thể là hook proc của bạn đang thực hiện quá nhiều hoạt động ngay cả trước khi kiểm tra xem loại sự kiện và bailing ra trên sự kiện không liên quan. Mang theo hook hook của bạn để chỉ trả về CallNextHook (...) và thêm vào thay đổi gia tăng. – nanda

+0

Tại sao biểu mẫu lớp phủ của bạn chỉ nhận được tất cả các sự kiện chuột xảy ra với nó và lọc chúng một cách thích hợp? Nếu nó phải xử lý một, xử lý nó. Nếu không, hãy trả lại nó trong suốt và để nó được chuyển đến cửa sổ bên dưới nó? Móc toàn cầu là hầu như luôn luôn là giải pháp sai (mặc dù đề nghị của nanda là một trong những tốt nếu bạn phải sử dụng một). –

+0

Cảm ơn cả ý kiến ​​của bạn, tôi đã chỉnh sửa câu hỏi đầu tiên của mình bằng một số mã và một số thông tin bổ sung. @Nanda Tôi không chắc chắn ý của bạn là gì, hiện tại tôi chỉ trả lại CallNextHookEx nhưng sự cố này đã xảy ra (tôi đã thêm mã proc vào bài đăng đầu tiên của mình). – VincentC

Trả lời

1

Bạn có thể muốn xem xét Easyhook (http://easyhook.codeplex.com/) cho phép bạn nối các cuộc gọi Windows API từ một quá trình đơn lẻ thay vì cho tất cả các quy trình.

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