Как установить высоту окна с помощью c #? - PullRequest
12 голосов
/ 26 июня 2011

Можно ли установить высоту окна, используя дескриптор окна или дескриптор процесса?

Пока у меня есть следующее, предположим, что речь идет о блокноте.

Process[] processes = Process.GetProcessesByName("notepad");

foreach (Process p in processes)
{

    if (p.MainWindowTitle == title)
    {

        handle = p.MainWindowHandle;

        while ((handle = p.MainWindowHandle) == IntPtr.Zero)
        {
            Thread.Sleep(1000);
            p.Refresh();
        }

        break;
    }

}

Могу ли я использовать handle или p для установки высоты окна?

Ответы [ 2 ]

14 голосов
/ 26 июня 2011

Вот как бы я это сделал:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect);

        [DllImport("user32.dll", SetLastError = true)]
        static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int Width, int Height, bool Repaint);

        static void Main(string[] args)
        {
            Process[] processes = Process.GetProcessesByName("notepad");
            foreach (Process p in processes)
            {
                IntPtr handle = p.MainWindowHandle;
                RECT Rect = new RECT();
                if (GetWindowRect(handle, ref Rect))
                    MoveWindow(handle, Rect.left, Rect.right, Rect.right-Rect.left, Rect.bottom-Rect.top + 50, true);
            }
        }
    }
}

Хотя вы можете сделать это с помощью SetWindowPos, а SetWindowPos - более новый и более функциональный API, MoveWindow проще вызывать.

7 голосов
/ 26 июня 2011

Вы должны иметь возможность использовать функцию Win32 SetWindowPos (используйте как для положения, так и для размера). Вот ссылка о том, как это сделать в C #.

Вот быстрый пример. Это позволит переместить блокнот в (10,10) на экране и изменить его размер до (450,450):

class Program
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);

    static void Main(string[] args)
    {
        Console.WriteLine("Start notepad and hit any key...");
        Console.ReadKey(true);
        Process[] processes = Process.GetProcessesByName("notepad");

        foreach (Process p in processes)
        {
            var handle = p.MainWindowHandle;

            SetWindowPos(handle, new IntPtr(SpecialWindowHandles.HWND_TOP), 10,10,450,450,SetWindowPosFlags.SWP_SHOWWINDOW);

            break;

        }

    }
}

public enum SpecialWindowHandles
{
    HWND_TOP = 0,
    HWND_BOTTOM = 1,
    HWND_TOPMOST = -1,
    HWND_NOTOPMOST = -2
}

[Flags]
public enum SetWindowPosFlags : uint
{
    SWP_ASYNCWINDOWPOS = 0x4000,

    SWP_DEFERERASE = 0x2000,

    SWP_DRAWFRAME = 0x0020,

    SWP_FRAMECHANGED = 0x0020,

    SWP_HIDEWINDOW = 0x0080,

    SWP_NOACTIVATE = 0x0010,

    SWP_NOCOPYBITS = 0x0100,

    SWP_NOMOVE = 0x0002,

    SWP_NOOWNERZORDER = 0x0200,

    SWP_NOREDRAW = 0x0008,

    SWP_NOREPOSITION = 0x0200,

    SWP_NOSENDCHANGING = 0x0400,

    SWP_NOSIZE = 0x0001,

    SWP_NOZORDER = 0x0004,

    SWP_SHOWWINDOW = 0x0040,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...