2009-10-10 6 views
17

J'ai trouvé un code source dans ce fil affiché par Rex Logan ici sur le SO:Position de réglage d'une fenêtre de console ouverte dans une WinForms App

link text

... il y a aussi un code très intéressant affiché dans ce même fil par Foredecker, mais il est incomplet et complexe: je ne suis pas assez sur la facilité 'Trace pour savoir comment l'implémenter complètement ...

Je suis capable d'utiliser ce code console Rex (aimablement) posté avec succès dans une application WinForms pour enregistrer divers événements, et pour pousser messa ges sur lesquels sont utiles dans le débogage; Je peux l'effacer du code de l'application, aussi. Ce que je n'arrive pas à faire est de définir de manière fiable la position de l'écran de la fenêtre de la console lorsque j'ouvre la fenêtre de la console (dans l'événement de chargement de la forme principale). Je reçois la compilation des erreurs de blocage de System.ArgumentOutOfRangeException si je tente de définir les propriétés windowLeft ou windowtop comme ceci:

La position de la fenêtre doit être réglé de telle que la taille de la fenêtre actuelle correspond à au sein de la mémoire tampon de la console, et les numéros ne doit pas être négatif. Nom du paramètre: gauche Valeur réelle était #

Je suis en mesure, cependant, pour définir les propriétés WindowWidth et WindowHeight.

J'ai essayé de déplacer le code qui active la console de divers emplacements, dont:

  1. dans le fichier Program.cs avant la MainForm est « rodent
  2. avant et après l'appel à » InitializeComponent() en le MainForm cteur
  3. en cas de charge de formulaire
  4. dans le formulaire d'événement montré

le CONSO le était activé d'accord dans tous ces endroits dans le code, mais sans changement dans le changement apparemment aléatoire de l'endroit où dans le quadrant supérieur gauche de l'écran il est apparu.

Lorsque la fenêtre de la console s'ouvre semble varier de façon aléatoire (le formulaire principal est toujours initialisé au même endroit sur l'écran).

Répondre

36

vous pouvez essayer quelque chose comme ça.

Ce code définit la position de la fenêtre de la console dans une application de console .

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 


namespace ConsoleApplication10 
{ 
    class Program 
    { 
    const int SWP_NOSIZE = 0x0001; 


    [DllImport("kernel32.dll", ExactSpelling = true)] 
    private static extern IntPtr GetConsoleWindow(); 

    private static IntPtr MyConsole = GetConsoleWindow(); 

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); 

    static void Main(string[] args) 
    { 
     int xpos = 300; 
     int ypos = 300; 
     SetWindowPos(MyConsole, 0, xpos, ypos, 0, 0, SWP_NOSIZE); 
     Console.WriteLine("any text"); 
     Console.Read(); 
    } 
    } 
} 

Ce code régler la position de la fenêtre de la console dans un WinForm application.

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 


namespace WindowsFormsApplication10 
{ 
    static class Program 
    { 

    const int SWP_NOSIZE = 0x0001; 

    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern bool AllocConsole(); 

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    public static extern IntPtr GetConsoleWindow(); 

    [STAThread] 
    static void Main() 
    { 
     AllocConsole(); 
     IntPtr MyConsole = GetConsoleWindow(); 
     int xpos = 1024; 
     int ypos = 0; 
     SetWindowPos(MyConsole, 0, xpos, ypos, 0, 0, SWP_NOSIZE); 
     Console.WindowLeft=0; 
     Console.WriteLine("text in my console"); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
    } 
} 
+0

Merci, RRUZ; J'ai pu intégrer votre code dans le code de base publié par Rex Logan et définir la fenêtre de la console où je le voulais. Je suis juste curieux: pourquoi l'appel à 'Console.Read()?Il s'agit d'une application WinForms que je suis en train d'exécuter et j'utilise la console uniquement pour la «consignation»: est-ce une opération standard lors de l'initialisation d'une console à partir d'une application WinForm? Merci beaucoup! mieux, Bill – BillW

+0

@BillW - c'est là pour que la fenêtre reste visible jusqu'à ce que vous frappiez 'return'. L'exemple ne fait rien après le réglage de la position de la fenêtre, donc se fermerait simplement et vous ne verriez pas qu'il avait la bonne position. – ChrisF

+0

Salut ChrisF, Merci pour votre réponse! fyi: En utilisant le code affiché par Rex Logan auquel je me suis connecté dans ma requête d'origine, la fenêtre Console persiste sans avoir besoin d'un appel à Console.Read(). meilleur, Bill – BillW

Questions connexes