J’utilise Windows Forms en C #.
J’ai un formulaire principal avec quelques barres d’outils qui contiennent toolSsortingpButtons. Après avoir utilisé un autre formulaire contenant des données, le formulaire principal perd le focus et le fait de cliquer sur un outilSsortingpButton ne déclenche pas l’événement OnClick: le premier clic active le formulaire principal et seul le deuxième clic appuie sur le bouton. J’ai besoin que l’utilisateur clique sur un bouton une seule fois pour déclencher un événement Click. Avez-vous des idées sur la manière de procéder? Merci.
Remarques:
Ce que vous devez faire, c’est créer une classe qui hérite de ToolSsortingp
et gère le WndProc
. C’est une façon de le faire. Il y en a d’autres.
private class MyToolSsortingp : ToolSsortingp { private const uint WM_LBUTTONDOWN = 0x201; private const uint WM_LBUTTONUP = 0x202; private static bool down = false; protected override void WndProc(ref Message m) { if (m.Msg == WM_LBUTTONUP && !down) { m.Msg = (int)WM_LBUTTONDOWN; base.WndProc(ref m); m.Msg = (int)WM_LBUTTONUP; } if (m.Msg == WM_LBUTTONDOWN) down = true; if (m.Msg == WM_LBUTTONUP) down = false; base.WndProc(ref m); } }
J’ai aussi vu cette solution:
protected override void WndProc(ref Message m) { // WM_MOUSEACTIVATE = 0x21 if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) this.Focus(); base.WndProc(ref m); }
Je me suis heurté à cela au dernier endroit où j’ai travaillé. Je pense que la solution que j’ai proposée fonctionnait davantage comme ce dernier, mais je n’ai pas access au code exact que j’ai utilisé.
si vous avez un formulaire sans frontières, cette logique fonctionnait pour vous, construit en 🙂
form.FormBorderStyle = FormBorderStyle.None