2012-07-31 12 views
5

Co mam teraz: moja aplikacja w języku C# jest półprzezroczysta i nie przechwytuje zdarzeń Winapi - każde kliknięcie, przeciągnięcie itp. To przechwytywanie przez okno underlaying, które jest osobną aplikacją (jak przeglądarka WWW). Używam tego do nakładania informacji na górze strony, co pokazuje przeglądarka. To jest mój kod to:Zdarzenia forward winapi do innego okna

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); 

Ale teraz chciałbym wysłać wszystkie zdarzenia zarówno mojego okna aplikacji (który jest pół-przezroczysty na górze) i przeglądarkę internetową (pod moim app). Jeśli na przykład kliknę, kliknięcie działa w obu oknach tak, jakby były na górze. Wyobrażam sobie, że jedynym sposobem, aby to zrobić, jest złapanie wszystkich zdarzeń, a następnie przekazanie ich do niższego okna, ale czy jest jakikolwiek sposób to zrobić? Używam winforms jako lib okna.


co robię teraz nie jest ważne, bo chcę normalnie zużywają zdarzenia, a następnie przekazuje je pod nią okna. To jest coś zupełnie innego od tego, co robię teraz z WS_EX_TRANSPARENT. Chodzi o to, aby jednocześnie przeciągać zawartość w obu oknach. Jeśli jest jakikolwiek lepszy sposób, z przyjemnością go usłyszę.


Co najmniej potrzebne jest przeniesienie zdarzeń przeciągania do obu okien i wszystkich innych zdarzeń do okna podlewanego (nie pod moją kontrolą). Być może łatwiej będzie pozostać przy moim oknie jako WS_EX_TRANSPARENT (sprawia, że ​​zdarzenia przechodzą do okna underlaying) i po prostu instaluję globalny hak do odbierania zdarzeń przeciągania? Co myślisz?

BTW Nie mam doświadczenia z Winapi, więc rozwiązanie może być oczywiste.

+0

I don” t zrozumieć, w jaki sposób nie dostajesz wydarzeń ... czy tworzysz rzeczywiste okno (powinieneś)? Lub po prostu rysowanie bezpośrednio na ekranie (nie powinieneś!)? – tenfour

+0

@tenfour Ustawiając styl 'WS_EX_TRANSPARENT'. – Neil

+0

@tenfour tak, korzystam z okna utworzonego przez .netform, a rysunek jest obsługiwany przez winform, więc powstaje okno. Ustawiam tylko styl WS_EX_TRANSPARENT i ustawę rodzica okna jako pulpitu, który sprawia, że ​​zdarzenie przechodzi do okna underlayingu, jak tutaj: http://www.codeproject.com/Articles/12877/Transparent-Click-Through-Forms i tak, powoduje, że komunikaty nie pojawiają się w oknie, o ile okno jest bezpośrednim potomkiem pulpitu. – Deadeye

Odpowiedz

0

Można uchwycić zdarzenia Okienka wysłał swoją własną formę przeciążenia WndProc na formularzu, lub alternatywnie poprzez wywołanie user32!GetMessage

można wysyłać wiadomości do innych form systemu Windows poprzez user32!PostMessage lub user32!SendMessage apis (read PostMessage function on msdn).

0

Możesz spróbować przekazać dalej wydarzenie po obsłużeniu go przez podstawowy formularz. Coś jak

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

W MyControl:

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

Użyłem tego do przekazania przewijania zdarzeń, w moim przypadku jednak tylko jedna z kontroli obsługiwane zdarzenie ..

Powiązane problemy