Простой хук на изменение размеров и положения окна - C#

Узнай цену своей работы

Формулировка задачи:

Как можно сделать так, чтобы моя программа C# могла реагировать на изменение размеров и положения некоего стороннего окна? Я знаю хэндл этого окна (IntPtr hWnd), например, это блокнот. Когда пользователь подвинул окно, моя программа должна тоже что-либо сделать, например, вывести сообщение или тоже изменить размеры и т.п. Как я понял, нужно установить хук, осталось узнать как это сделать наиболее простым способом. Спасибо)

Решение задачи: «Простой хук на изменение размеров и положения окна»

textual
Листинг программы
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace ConsoleApplicationMy
{
    class Program
    {
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]        
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [DllImport("user32.dll", SetLastError = true)]        
        static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr
           hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess,
           uint idThread, uint dwFlags);                
 
        [DllImport("user32.dll")]
        static extern bool UnhookWinEvent(IntPtr hWinEventHook);
 
        delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType,
                      IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
 
        const uint EVENT_OBJECT_LOCATIONCHANGE = 0x800B;
        const uint WINEVENT_OUTOFCONTEXT = 0;
 
        static IntPtr myHandle;
        static WinEventDelegate procDelegate;
        static IntPtr hhook;
 
        static void Main(string[] args)
        {
            myHandle = FindWindow("Notepad", "Безымянный — Блокнот");            
            if (myHandle == IntPtr.Zero)
            {
                return;
            }
 
            procDelegate = new WinEventDelegate(WinEventProc);
            hhook = SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE, IntPtr.Zero,
                    procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);
 
            MessageBox.Show("");
 
            UnhookWinEvent(hhook);
        }
 
        static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
        {            
            if (myHandle == hwnd)
            {
                Console.WriteLine(DateTime.Now.ToString());
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы