2009-10-10 38 views
17

Tôi tìm thấy một số mã nguồn trong chủ đề này được đăng bởi Rex Logan ở đây trên SO:Setting vị trí của một cửa sổ điều khiển mở trong một WinForms App

link text

... cũng có một số mã rất thú vị đăng tải trong cùng một chủ đề này bởi Foredecker, nhưng nó không đầy đủ và phức tạp: Tôi không đủ về cơ sở Trace để biết cách thực hiện đầy đủ ...

Tôi có thể sử dụng mã Console này Rex (vui lòng) đăng thành công trong ứng dụng WinForms để đăng nhập các sự kiện khác nhau và để thúc đẩy messa ges vào đó là hữu ích trong gỡ lỗi; Tôi cũng có thể xóa nó khỏi mã ứng dụng.

Điều tôi dường như không thể làm là đặt vị trí màn hình của Cửa sổ Bảng điều khiển một cách đáng tin cậy khi tôi mở Cửa sổ Bảng điều khiển (trong sự kiện tải Biểu mẫu Chính). Tôi nhận biên dịch ngăn chặn lỗi System.ArgumentOutOfRangeException nếu tôi cố gắng thiết lập WindowLeft hoặc WindowTop tính như thế này:

Các vị trí cửa sổ phải được thiết lập như rằng kích thước cửa sổ hiện hành phù hợp với trong bộ đệm của giao diện điều khiển, và số không được âm. Tên Parameter: trái Giá trị thực tế là #

tôi có thể, tuy nhiên, để thiết lập các thuộc WindowWidth và WindowHeight.

Tôi đã cố gắng di chuyển mã đó kích hoạt các địa điểm khác nhau điều khiển bao gồm:

  1. trong Program.cs nộp trước MainForm là 'chạy
  2. trước và sau khi cuộc gọi đến' InitializeComponent() trong các MainForm ctor
  3. trong trường hợp Form tải
  4. trong Mẫu Thể hiện sự kiện

các Conso le đã được kích hoạt ở tất cả những nơi này trong mã, nhưng không có sự thay đổi trong việc chuyển đổi dường như ngẫu nhiên xung quanh nơi ở góc phần tư phía trên bên trái của màn hình nó xuất hiện.

Khi cửa sổ Bảng điều khiển mở ra có vẻ khác nhau một cách ngẫu nhiên (Biểu mẫu chính luôn được khởi tạo ở cùng một vị trí trên màn hình).

Trả lời

36

bạn có thể thử một cái gì đó như thế này.

Mã này đặt vị trí của Cửa sổ bảng điều khiển trong ứng dụng 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(); 
    } 
    } 
} 

Mã này thiết lập vị trí của các cửa sổ Console trong một ứng dụng WinForm .

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

Cảm ơn bạn, RRUZ; Tôi đã có thể kết hợp mã của bạn vào mã cơ sở được đăng bởi Rex Logan và thiết lập cửa sổ Console nơi tôi muốn. Tôi chỉ tò mò: tại sao cuộc gọi đến 'Console.Read()?Đây là một ứng dụng WinForms tôi đang chạy, và tôi đang sử dụng Console chỉ cho "đăng nhập": đây có phải là một điều tiêu chuẩn để làm khi khởi tạo một Console từ bên trong một ứng dụng WinForm? Rất cám ơn! tốt nhất, Bill – BillW

+0

@BillW - nó ở đó để cửa sổ vẫn hiển thị cho đến khi bạn nhấn 'return'. Ví dụ không làm gì sau khi thiết lập vị trí cửa sổ như vậy sẽ chỉ đơn giản là đóng và bạn sẽ không thấy rằng nó có vị trí đúng. – ChrisF

+0

Xin chào ChrisF, Cảm ơn câu trả lời của bạn! fyi: Sử dụng mã được đăng bởi Rex Logan mà tôi đã liên kết trong yêu cầu ban đầu của tôi, cửa sổ Bảng điều khiển vẫn tồn tại mà không cần bất kỳ cuộc gọi nào đến Console.Read(). tốt nhất, Bill – BillW

Các vấn đề liên quan