Fondamentalement, j'ai une DLL qui a un formulaire compilé en elle. Le formulaire sera utilisé pour afficher des informations à l'écran. Finalement, il sera asynchrone et exposera beaucoup de personnalisation dans la DLL. Pour l'instant, je veux juste qu'il s'affiche correctement. Le problème que j'ai est que j'utilise la DLL en le chargeant dans une session Powershell. Donc, quand j'essaie d'afficher le formulaire et de le mettre au point, il n'a aucun problème à afficher sur toutes les autres applications, mais je ne peux pas pour la vie de moi l'afficher sur la fenêtre Powershell . Voici le code que j'utilise actuellement pour essayer de l'afficher. Je suis sûr que la majorité ne sera pas nécessaire une fois que je l'aurai compris, cela représente tout ce que j'ai trouvé via google.C# Force Form Focus
CLass Blah
{
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni);
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll", EntryPoint = "ShowWindowAsync")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
private const int WS_SHOWNORMAL = 1;
public void ShowMessage(string msg)
{
MessageForm msgFrm = new MessageForm();
msgFrm.lblMessage.Text = "FOO";
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.TopMost = true;
msgFrm.Activate();
SystemParametersInfo((uint)0x2001, 0, 0, 0x0002 | 0x0001);
ShowWindowAsync(msgFrm.Handle, WS_SHOWNORMAL);
SetForegroundWindow(msgFrm.Handle);
SystemParametersInfo((uint)0x2001, 200000, 200000, 0x0002 | 0x0001);
}
}
Comme je le dis, je suis sûr que la plupart de ce qui est pas nécessaire ou même dans l'erreur, je voulais juste montrer les choses que j'avais essayé. De plus, comme je l'ai mentionné, j'ai l'intention de faire en sorte que cela soit affiché de façon asynchrone à un moment donné, ce qui, je le suppose, se terminera par un fil séparé. Est-ce que diviser le formulaire dans son propre thread le rend plus facile de le faire se concentrer sur la session Powershell?
@Joel, merci pour l'info. Voici ce que j'ai essayé en fonction de votre suggestion:
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.Focus();
Application.DoEvents();
La forme se heurte encore sous la session Powershell. Je vais continuer à travailler sur le filetage. J'ai généré des threads auparavant mais jamais là où le thread parent avait besoin de parler au thread fils, donc nous verrons comment ça se passe.
Thnks pour toutes les idées jusqu'ici les gens.
Ok, l'enfilage s'est occupé du problème. @Quarrelsome, j'ai essayé les deux. Ni l'un ni l'autre (ni les deux ensemble) n'a fonctionné. Je suis curieux de savoir ce qui est mal à propos de l'utilisation du filetage? Je n'utilise pas Application.Run et je n'ai toujours pas de problème. J'utilise une classe de médiateur à laquelle le thread parent et le thread enfant ont accès. Dans cet objet, j'utilise un ReaderWriterLock pour verrouiller une propriété qui représente le message que je veux afficher sur le formulaire que le thread enfant crée. Le parent verrouille la propriété puis écrit ce qui doit être affiché. Le thread enfant verrouille la propriété et lit ce qu'il doit modifier l'étiquette du formulaire. L'enfant doit faire cela sur un intervalle d'interrogation (je le par défaut à 500ms) dont je ne suis pas très heureux, mais je n'ai pas pu trouver un moyen de faire savoir au fils fils que la propriété avait changé, alors Je suis coincé avec l'interrogation.
Pouvez-vous appeler simplement mise au point() sur l'un des contrôles sous la forme? –
Merci pour les réponses. @Chad, essayant juste de Focus() un contrôle sur le formulaire s'est terminé avec les mêmes résultats que je recevais déjà. @Dean, je pense que pour utiliser votre méthode, je devrais diviser le formulaire en son propre fil. Je prévoyais de faire ce chemin à un moment donné, donc je suppose que je vais commencer à ce sujet maintenant. – EBGreen