From 48c63b3bb0db17b75cd29ba65df1d32a60e27bf1 Mon Sep 17 00:00:00 2001 From: Dan Clark Date: Sat, 2 Nov 2024 20:08:57 +0000 Subject: [PATCH] Moved WndProcMonitor to this project --- Toolkit.Windows/IWndProcMonitor.cs | 7 +++ Toolkit.Windows/PointerMonitor.cs | 69 ++++++++++++++++++++++++++--- Toolkit.Windows/WndProcEventArgs.cs | 3 ++ 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 Toolkit.Windows/IWndProcMonitor.cs create mode 100644 Toolkit.Windows/WndProcEventArgs.cs diff --git a/Toolkit.Windows/IWndProcMonitor.cs b/Toolkit.Windows/IWndProcMonitor.cs new file mode 100644 index 0000000..70f11e8 --- /dev/null +++ b/Toolkit.Windows/IWndProcMonitor.cs @@ -0,0 +1,7 @@ +using Toolkit.Foundation; + +namespace Toolkit.Windows; + +public interface IWndProcMonitor : + IInitialization, + IDisposable; diff --git a/Toolkit.Windows/PointerMonitor.cs b/Toolkit.Windows/PointerMonitor.cs index c734816..48101d3 100644 --- a/Toolkit.Windows/PointerMonitor.cs +++ b/Toolkit.Windows/PointerMonitor.cs @@ -1,12 +1,71 @@ -using System.Drawing; -using Windows.Win32; -using Windows.Win32.UI.WindowsAndMessaging; -using Windows.Win32.Foundation; -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; +using System.Drawing; using Toolkit.Foundation; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.Graphics.Gdi; +using Windows.Win32.UI.WindowsAndMessaging; namespace Toolkit.Windows; +public class WndProcMonitor(IPublisher publisher) : + IWndProcMonitor +{ + private WNDPROC? handler; + private readonly IPublisher publisher = publisher; + + public IntPtr Handle { get; private set; } + + public void Dispose() + { + PInvoke.DestroyWindow((HWND)Handle); + } + + private unsafe void InitializeWndProc() + { + var windowName = Guid.NewGuid().ToString(); + handler = Wndproc; + + WNDCLASSW wndProcWindow; + + wndProcWindow.style = 0; + wndProcWindow.lpfnWndProc = handler; + wndProcWindow.cbClsExtra = 0; + wndProcWindow.cbWndExtra = 0; + wndProcWindow.hInstance = new HINSTANCE(); + wndProcWindow.hIcon = new HICON(); + wndProcWindow.hCursor = new HCURSOR(); + wndProcWindow.hbrBackground = new HBRUSH(); + + fixed (char* menuName = "") + { + wndProcWindow.lpszMenuName = new PCWSTR(menuName); + } + + fixed (char* className = windowName) + { + wndProcWindow.lpszClassName = new PCWSTR(className); + } + + PInvoke.RegisterClass(wndProcWindow); + Handle = PInvoke.CreateWindowEx(0, wndProcWindow.lpszClassName, + new PCWSTR(), 0, 0, 0, 0, 0, new HWND(), + new HMENU(), + new HINSTANCE()); + } + + private LRESULT Wndproc(HWND param0, uint param1, WPARAM param2, LPARAM param3) + { + publisher.Publish(new WndProcEventArgs(param1, (uint)param2.Value, (uint)param3.Value)); + return PInvoke.DefWindowProc(param0, param1, param2, param3); + } + + public void Initialize() + { + InitializeWndProc(); + } +} + public class PointerMonitor(IPublisher publisher) : IPointerMonitor diff --git a/Toolkit.Windows/WndProcEventArgs.cs b/Toolkit.Windows/WndProcEventArgs.cs new file mode 100644 index 0000000..d52724c --- /dev/null +++ b/Toolkit.Windows/WndProcEventArgs.cs @@ -0,0 +1,3 @@ +namespace Toolkit.Windows; + +public record WndProcEventArgs(uint Message, uint WParam, uint LParam);