Activer un formulaire et cliquer sur le bouton de processus en même temps?

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:

  • J’utilisais MDI et il n’y avait aucun problème à cliquer sur les boutons de formulaire du parent. Mais maintenant, il est primordial que les formulaires flottent librement sur plusieurs affichages.
  • Les formulaires de travailleur ont le formulaire principal comme propriété du propriétaire, ce qui leur permet de restr au-dessus du formulaire principal.
  • Lorsque je clique sur le bouton d’un formulaire inactif, aucun de MouseHover, MouseEnter, MouseDown ni MouseUp ne se déclenche. Il s’agit de l’événement Activate du formulaire principal.
  • Il y a une arborescence (à l’intérieur d’un tabControl, à l’intérieur d’un splitContainer, à l’intérieur d’un panneau), sur la fiche principale. Ses éléments sont sélectionnés lors d’un premier clic de souris, même si le formulaire principal est inactif. Je suppose que tous les contrôles ne sont pas égaux!

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