2014-02-28 14 views
7

Ich habe eine Windows Forms App mit einem Toolstrip, der Schaltflächen enthält. Frustrierend muss ich zweimal auf irgendeinen Knopf klicken, um es zu schießen, wenn das Formular nicht fokussiert ist. Der erste Klick scheint das Formular zu aktivieren, und ein zweiter Klick klickt auf den Button (alternativ kann ich irgendwo auf das Formular klicken und dann einmal auf den Button klicken). Wie kann ich das beheben, damit ich, auch wenn das Formular nicht aktiviert ist, direkt auf eine Schaltfläche klicken kann?Wie kann ein ToolStrip-Button sofort angeklickt werden, ohne zuerst auf das Formular zu klicken?

EDIT: Ich denke, das sollte machbar sein, da es in Programmen wie SQL Server Profiler und Visual Studio funktioniert (nicht, dass diese WinForms verwenden, aber es würde vorschlagen, dass es kein Betriebssystemproblem ist).

+0

Scheint wie eine gute Idee. Warte geduldig auf eine Antwort –

+0

Ich denke, das sind die besten Antworten: https: //stackoverflow.com/a/4967537/767664 und https://Stackoverflow.com/a/1892990/767664 – Pedro77

Antwort

1

versuchen, etwas wie folgt aus:

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo); 

private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
private const int MOUSEEVENTF_LEFTUP = 0x04; 
private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 
private const int MOUSEEVENTF_RIGHTUP = 0x10; 

private const int WM_PARENTNOTIFY = 0x210; 
private const int WM_LBUTTONDOWN = 0x201; 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_PARENTNOTIFY) 
    { 
     if (m.WParam.ToInt32() == WM_LBUTTONDOWN && ActiveForm != this) 
     { 
      Point p = PointToClient(Cursor.Position); 
      if (GetChildAtPoint(p) is ToolStrip) 
       mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, (uint)p.X, (uint)p.Y, 0, 0); 
     } 
    } 
    base.WndProc(ref m); 
} 

EDIT: Werke für ToolStrip jetzt.

+0

Ich habe mein Beispiel aktualisiert. Jetzt funktioniert es für 'ToolStrip' und überspringt übermäßige Klicks für andere Steuerelemente. – Dmitry

0

Hier ist eine alternative Möglichkeit, dies zu tun. Sie können das Activated-Ereignis des Formulars verwenden und dann überprüfen, ob sich die Maus über einem Toolstrip-Button befindet. Wenn ja, rufen Sie PerformClick().

private void Form1_Activated(object sender, EventArgs e) 
{ 
    for (int i = 0; i < toolStrip1.Items.Count; i++) 
    { 
     ToolStripItem c = toolStrip1.Items[i]; 
     if (new RectangleF(new Point(i * (c.Size.Width - 1) + this.Location.X + 18, this.Location.Y + 32), c.Size).Contains(MousePosition)) 
      c.PerformClick(); 
    } 
} 

(Die 18 und 32 sind die Versätze des toolstripcontainer von der Position des Formulars). Es kann einen Weg geben, um tatsächlich zu berechnen, was die X- und Y-Offsets sein sollten, aber das funktionierte für mich. HTH

+0

Dies funktioniert nicht für Rechtsklick, der das gleiche Problem hat. – user169771