2012-07-31 39 views
5

Điều tôi hiện có: ứng dụng của tôi trong C# là một nửa trong suốt và không nắm bắt được các sự kiện winapi - mỗi lần nhấp, kéo, v.v ... bắt được bằng cửa sổ underlaying, là ứng dụng riêng biệt (như webbrower). Tôi sử dụng thông tin này để che phủ thông tin trên trình duyệt hiển thị. Đây là mã của tôi cho điều này:chuyển tiếp các sự kiện winapi sang cửa sổ khác

int exstyle = GetWindowLong(this.Handle, GWL_EXSTYLE); 
exstyle |= WS_EX_TRANSPARENT; 
SetWindowLong(this.Handle, GWL_EXSTYLE, exstyle); 

IntPtr hwndf = this.Handle; 
IntPtr hwndParent = GetDesktopWindow(); 
SetParent(hwndf, hwndParent); 

Nhưng bây giờ, tôi muốn gửi tất cả các sự kiện tới cả cửa sổ ứng dụng (nửa trong suốt trên đầu) và trình duyệt web (trong ứng dụng của tôi). Vì vậy, ví dụ nếu tôi nhấp vào, nhấp chuột hoạt động trong cả hai cửa sổ như thể chúng ở trên cùng. Tôi tưởng tượng rằng cách duy nhất để làm điều đó là bắt tất cả các sự kiện và sau đó chuyển tiếp chúng đến cửa sổ thấp hơn, nhưng có cách nào để làm điều đó không? Tôi sử dụng winforms làm lib cửa sổ.


gì tôi làm bây giờ không phải là quan trọng, bởi vì tôi muốn bình thường tiêu thụ các sự kiện, sau đó chuyển đến cửa sổ underlaying. Vì vậy, đây là một cái gì đó hoàn toàn khác với những gì tôi đang làm bây giờ với WS_EX_TRANSPARENT. Điểm của việc này là kéo nội dung trong cả hai cửa sổ cùng một lúc. Nếu có cách nào tốt hơn để làm điều đó, tôi sẽ rất vui khi nghe nó.


Ít nhất những gì tôi cần là chuyển sự kiện kéo đến cả hai cửa sổ và tất cả sự kiện khác đến cửa sổ lớp phủ (không nằm trong tầm kiểm soát của tôi). Vì vậy, có lẽ nó sẽ được dễ dàng hơn để ở lại với cửa sổ của tôi như WS_EX_TRANSPARENT (làm cho các sự kiện pass-thru để cửa sổ underlaying) và chỉ cần cài đặt móc toàn cầu để nhận các sự kiện kéo? Bạn nghĩ sao?

BTW tôi không có kinh nghiệm với Winapi, vì vậy giải pháp có thể là hiển nhiên.

+0

I don' t hiểu làm thế nào bạn không nhận được sự kiện ... là bạn tạo ra một cửa sổ thực tế (bạn nên)? Hoặc chỉ vẽ trực tiếp lên màn hình (bạn không nên!)? – tenfour

+0

@tenfour Bằng cách đặt kiểu 'WS_EX_TRANSPARENT'. – Neil

+0

@tenfour có, tôi sử dụng cửa sổ được tạo bởi .net winform, và bản vẽ được xử lý bởi winform, do đó, nó tạo ra cửa sổ. Tôi chỉ thiết lập kiểu WS_EX_TRANSPARENT và đặt cha mẹ cửa sổ làm máy tính để bàn, điều này làm cho sự kiện chuyển sang cửa sổ lớp phủ, như sau: http://www.codeproject.com/Articles/12877/Transparent-Click-Through-Forms và có, nó làm cho tin nhắn không đi vào cửa sổ, miễn là cửa sổ là con của máy tính để bàn trực tiếp. – Deadeye

Trả lời

0

Bạn có thể chụp của Windows kiện gửi hình thức riêng của mình do quá tải WndProc trên biểu mẫu, hoặc cách khác bằng cách gọi user32!GetMessage

Bạn có thể gửi tin nhắn đến các hình thức khác của Windows thông qua user32!PostMessage hoặc user32!SendMessage apis (read PostMessage function on msdn).

0

Bạn có thể thử chuyển tiếp sự kiện sau khi biểu mẫu cơ bản đã xử lý sự kiện đó. Một cái gì đó như

protected override void OnDragOver(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    MyControl.ForwardDragEvent(drgevent); 
} 

Trong MyControl:

public void ForwardDragEvent(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    //Or call your own method to handle the event 
} 

Tôi đã sử dụng này để chuyển tiếp di chuyển-sự kiện, trong trường hợp của tôi tuy nhiên, chỉ có một trong các điều khiển xử lý sự kiện này ..

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