Простой хук на изменение размеров и положения окна - 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());
}
}
}
}