Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2012, 17:15   #1
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию Получение размеров чужого окна

Возник вопрос по получению размеров окна стороннего приложения. Пробовал WinAPI GetWindowRect(), но он выдает совершенно не то, что выдает Spy++. Реальный размер окна 1000х700, а он мне показывает 402х265. Может эти координаты нужно как то преобразовывать или какая другая функция есть кроме GetWindowRect() и GetClientRect() ?
s77lanselot77s вне форума Ответить с цитированием
Старый 29.06.2012, 17:59   #2
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

хм... для меня GetWindowRect() работает прекрасно
Код:
[DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }

        Rectangle myRect = new Rectangle();

        private void button1_Click(object sender, System.EventArgs e)
        {
            RECT rct;

            if(!GetWindowRect(new HandleRef(this, this.Handle), out rct ))
            {
                MessageBox.Show("ERROR");
                return;
            }
            MessageBox.Show( rct.ToString() );

            myRect.X = rct.Left;
            myRect.Y = rct.Top;
            myRect.Width = rct.Right - rct.Left + 1;
            myRect.Height = rct.Bottom - rct.Top + 1;
        }
http://www.pinvoke.net/default.aspx/...indowRect.html
Reskov вне форума Ответить с цитированием
Старый 29.06.2012, 19:13   #3
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Reskov Посмотреть сообщение
хм... для меня GetWindowRect() работает прекрасно
Код:
[DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }

        Rectangle myRect = new Rectangle();

        private void button1_Click(object sender, System.EventArgs e)
        {
            RECT rct;

            if(!GetWindowRect(new HandleRef(this, this.Handle), out rct ))
            {
                MessageBox.Show("ERROR");
                return;
            }
            MessageBox.Show( rct.ToString() );

            myRect.X = rct.Left;
            myRect.Y = rct.Top;
            myRect.Width = rct.Right - rct.Left + 1;
            myRect.Height = rct.Bottom - rct.Top + 1;
        }
http://www.pinvoke.net/default.aspx/...indowRect.html
if(!GetWindowRect(new HandleRef(this, this.Handle), out rct )) Ошибка: Не содержит определения для 'Handle'...

Пробовал получить хендл через FindWindow() с HandleRef, но летели ошибки, поэтому пришлось юзать IntPtr и в FindWindow для получения хендла и в GetWindowRect(), чтобы этот хендл передать... Но проблема так и не решилась

Последний раз редактировалось s77lanselot77s; 29.06.2012 в 19:17.
s77lanselot77s вне форума Ответить с цитированием
Старый 29.06.2012, 20:01   #4
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

Только что проверил, выдает те же самые результаты(
s77lanselot77s вне форума Ответить с цитированием
Старый 29.06.2012, 20:04   #5
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Даже скачал spy++ все норм... в нем ClientRect
вот код...
Код:
public static class Methods
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

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

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        // Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.

        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

        [DllImport("user32.dll")]
        public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);

        public static IntPtr FindWindow(string windowName, bool wait)
        {
            IntPtr hWnd = FindWindow(null, windowName);
            while (wait && hWnd.ToInt32() == 0)
            {
                System.Threading.Thread.Sleep(500);
                hWnd = FindWindow(null, windowName);
            }

            return hWnd;
        }
    }
    
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }
    



    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var rect = new RECT();
            Methods.GetClientRect(Methods.FindWindow("Untitled - Notepad", true), out rect);

            MessageBox.Show(Math.Abs(rect.Right - rect.Left) + " " + Math.Abs(rect.Top - rect.Bottom));
        }
    }
пс модуль просто так потому что читать лень) скорей всего он там не нужен
Reskov вне форума Ответить с цитированием
Старый 29.06.2012, 20:32   #6
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

Проверил... Блокнот он вообще не нашел... А со сторонним приложением показал то же самое

Попробовал с другим приложением все работает, а с тем, которое мне нужно нет..(

Последний раз редактировалось s77lanselot77s; 29.06.2012 в 22:43.
s77lanselot77s вне форума Ответить с цитированием
Старый 30.06.2012, 00:38   #7
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

скажите что за приложение тогда может...(
Reskov вне форума Ответить с цитированием
Старый 30.06.2012, 11:40   #8
s77lanselot77s
Пользователь
 
Аватар для s77lanselot77s
 
Регистрация: 06.01.2011
Сообщений: 23
По умолчанию

Покерный клиент. После запуска открывается клиент и в отдельной форме открывается форма для входа. Так вот для формы входа все правильно считает, а вот для самого окна клиента неправильно показывает.
s77lanselot77s вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отслеживание изменения положения и размеров окна RAZOR1703 Win Api 9 03.12.2011 16:43
Изменение размеров окна Liones Общие вопросы Delphi 4 15.10.2010 09:01
Изменение размеров окна представления Syuf Общие вопросы C/C++ 0 27.08.2010 15:40
Изменение размеров окна Light Alloy Общие вопросы Delphi 2 06.10.2009 07:21
Текст при изменении размеров окна Dj_smart HTML и CSS 2 25.11.2008 23:23