2010-12-28 8 views
5

Ich habe ein Dienstprogramm zur Bildschirmaufnahme, auf dem ich einen Bereich auf dem Desktop kleben kann. Ich habe dies getan ist eine ziemlich einfache Art und Weise, ich habe eine Form, die die gleiche Größe wie der Bildschirm ist, auf dem ich einen Screenshot des Desktops in Graustufen verwandelt. Wenn der Benutzer die linke Maustaste gedrückt hält, kann er einen Bereich auf dem Formular auswählen. Das Rechteck, das der Benutzer zeichnet, ist mit TransparentColor gefüllt. Sobald der Benutzer seine Maus hochhebt, bleibt das transparente Rechteck an seinem Platz und der tatsächliche Desktop ist sichtbar. Hier kommt mein Problem: Auf meinem Dev-PC kann ich tatsächlich durch dieses transparente Rechteck klicken und navigieren usw. Während auf meinem anderen PC das Formular reagiert, klickt Mausklick auf das eigentliche transparente Rechteck.Click-through auf dem Desktop auf einem transparenten Formular

Ich benutze .NET 4.0 in C#, irgendwelche Ideen, wie ich es auf allen Fällen auf den Desktop klicken kann ??

Vielen Dank und sehr geschätzt :)

Antwort

7

ich nach einem Blick sehr tief in diese eine richtige Lösung für dieses Problem finden verwaltet. Es stellt sich heraus, mit den richtigen Win32-API-Aufrufe ist es möglich, ein Formular "Unsichtbar" für Mausklicks zu setzen. Dies kann erreicht werden durch:

[DllImport("user32.dll", SetLastError = true)] 
static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

[DllImport("user32.dll")] 
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

[DllImport("user32.dll")] 
static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags); 

public void SetFormTransparent(IntPtr Handle) { 
    oldWindowLong = GetWindowLong(Handle, GWL_EXSTYLE); 
    SetWindowLong(Handle, GWL_EXSTYLE, Convert.ToInt32(oldWindowLong | WS_EX_LAYERED | WS_EX_TRANSPARENT)); 
} 

public void SetFormNormal(IntPtr Handle) { 
    SetWindowLong(Handle, GWL_EXSTYLE, Convert.ToInt32(oldWindowLong | WS_EX_LAYERED)); 
} 

Aber es gibt einen Trick zu allem. Sie müssen darauf achten, dass alle im Forum getätigten Klicks durch das Formular fallen und an etwas unterhalb des Formulars gesendet werden. Um sicherzustellen, dass, wenn ich auf mein Formular z. auf einen Knopf und ich will den Knopf geklickt habe ich einen einfachen Trick. Ich habe einen Timer im Hintergrund, der alle N Millisekunden läuft und die Position des Cursors analysiert. Wenn es über dem Bereich liegt, den ich möchte, wird das Formular über SetFormNormal() auf Normal gesetzt, ansonsten ist es transparent.

Hoffe, dieser Code Bit hilft und die Leute werden es verwenden.

+0

Anstatt einen Timer zu verwenden, warum nutzen Sie nicht die OnMouseEnter/OnMouseDown-Ereignisse für jedes Steuerelement in Ihrem Formular? – Jason

+6

Fügen Sie die fehlenden Werte für die Konstanten hinzu. –

+0

Hier sind einige nützliche Links: http://stackoverflow.com/questions/1524035/topmost-form-clicking-through-possible, http://pinvoke.net/default.aspx/Constants.GWL%20-%20GetWindowLong, http://pinvoke.net/default.aspx/Constants.Window%20styles – Xantix

Verwandte Themen