Неправильный размер окна переднего плана - PullRequest
1 голос
/ 28 сентября 2011

Я пишу программу на c #, которая реализует хуки для мыши и клавиатуры, и после нажатия на указанную клавишу она перейдет к окну переднего плана и сохранит его x, y, высоту и ширину в xml-файле.

IЯ не уверен, что не так, но я продолжаю получать неправильные размеры и неправильные параметры.

Я был бы признателен за помощь по этому вопросу, поскольку я боролся с ним в течение двух дней.

Сильфонсоответствующий код.

Стандартные объявления:

//rectangle for the windows size
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }


        //win API
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetForegroundWindow();

        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        public static extern bool SetForegroundWindow(IntPtr hwnd);

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

И сам соответствующий код

void mouseHook_MouseDown(object sender, MouseEventArgs e)
        {
            this.handle = GetForegroundWindow();   
        }

        #region keyboard pressed
        void keyboardHook_KeyDown(object sender, KeyEventArgs e)
        {            
            if (e.KeyCode == Keys.F9) //if slot selected
            {
                RECT Rect = new RECT();
                SetForegroundWindow(this.handle);
                //this.handle = GetForegroundWindow();    
                GetWindowRect(this.handle, ref Rect);

                Grid newSlot = new Grid();
                newSlot.topX = Rect.Top;
                newSlot.topY = Rect.Left;
                newSlot.width = Rect.Right - Rect.Left;
                newSlot.height = Rect.Bottom - Rect.Top;

                layoutGrid.Add(newSlot);
                lbl_slots.Text = layoutGrid.Count().ToString();
            }
            else if (e.KeyCode == Keys.F10) //if main stack slot selected
            {
                RECT Rect = new RECT();
                SetForegroundWindow(handle);
                GetWindowRect(GetForegroundWindow(), ref Rect);    
                for (int i = 0; i < layoutGrid.Count(); i++) //selecting slot for main stack
                {
                    layoutGrid[i].slot_number = i + 1; //setting slots numbers
                    if (layoutGrid[i].topX != Rect.Top && layoutGrid[i].topY != Rect.Left)
                        layoutGrid[i].is_stack = false;
                    else
                    {
                        layoutGrid[i].is_stack = true;
                        lbl_stackSlot.Text = (i + 1).ToString();

                    }
                }
            }
        }

РЕДАКТИРОВАТЬ: Я пытался использовать оба открытыхstruct RECT и Rectangle, значения с RECT, которые я получаю, кажутся случайными, я имею в виду left и top, а также height и width, иногда он находит правильные точки, но иногда кажется, что они абсолютно случайные.Кажется, что значения, которые я получаю с помощью Rectangle, имеют правильные левый и верхний угол, но возвращают неправильную высоту и ширину.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Я наконец нашел решение.Выяснил, будет публиковать его здесь, если кто-нибудь столкнется с той же проблемой.

Я в конечном итоге использовал GetWindowInfo вместо GetWindowRect, и это работает как шарм.

Взял пример кода и статью, которую я нашелонлайн http://kenneththorman.blogspot.com/2010/08/c-net-active-windows-size-helper.html

Спасибо всем, кто пытался помочь.

0 голосов
/ 28 сентября 2011

Использование System.Drawing.Rectangle неверно. Поля не совпадают. Ваше определение RECT верно.

Я думаю, немного, но ваша проблема может быть связана с комментарием внизу темы GetWindowRect MSDN.

Приложения под Vista, которые не связаны с WINVER = 6, получат здесь вводящий в заблуждение набор значений, которые не учитывают дополнительное заполнение «стеклянных» пикселей, которые Vista Aero применяет к окну. Похоже, что это происходит даже в Aero Basic (без стекла), чтобы сохранить согласованность размеров. Обходной путь (если вы не хотите устанавливать WINVER = 6), по-видимому, заключается в том, чтобы динамически связываться с dwmapi.dll и использовать GetProcAddress () для получения функции DwmGetWindowAttribute () и вызывать ее с аргументом DWMWA_EXTENDED_FRAME_BOUNDS для запроса подлинного окна размеры рамы.

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