Last active
April 7, 2022 08:59
-
-
Save SelvinPL/2a12da21e7b97232b25ec6d7a1452331 to your computer and use it in GitHub Desktop.
Paste it to linqpad, add references and imports (bonus NativeWindow solution)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//using System.Windows.Forms | |
//using System.Runtime.InteropServices | |
//add references to System.Windows.Forms.dll | |
void Main() | |
{ | |
var frm = new Form(); | |
WndProc oldWndProc = null; | |
WndProc newWndProc = (hWnd, Msg, wParam, lParam) => | |
{ | |
Console.WriteLine("hWnd; {0}, Msg: {1}, wParam: {2}, lParam: {3}", hWnd, Msg, wParam, lParam); | |
if(oldWndProc != null) | |
return oldWndProc(hWnd, Msg, wParam, lParam); | |
return IntPtr.Zero; | |
}; | |
oldWndProc = SetWindowProc(frm.Handle, newWndProc); | |
//or | |
//var sniffer = new SnifferNativeWindow(frm); | |
Application.Run(frm); | |
} | |
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] | |
public delegate IntPtr WndProc(IntPtr hWnd, WindowsMessage msg, IntPtr wParam, IntPtr lParam); | |
[DllImport("user32.dll", EntryPoint = "SetWindowLongW")] | |
private static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, IntPtr dwNewLong); | |
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtrW")] | |
private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); | |
const int GWLP_WNDPROC = -4; | |
public static WndProc SetWindowProc(IntPtr hWnd, WndProc newWndProc) | |
{ | |
IntPtr newWndProcPtr = Marshal.GetFunctionPointerForDelegate(newWndProc); | |
IntPtr oldWndProcPtr; | |
if (IntPtr.Size == 8) | |
oldWndProcPtr = SetWindowLongPtr64(hWnd, GWLP_WNDPROC, newWndProcPtr); | |
else | |
oldWndProcPtr = SetWindowLongPtr32(hWnd, GWLP_WNDPROC, newWndProcPtr); | |
var proc = Marshal.GetDelegateForFunctionPointer(oldWndProcPtr, typeof(WndProc)); | |
//hack because GetDelegateForFunctionPointer returns System.Windows.Forms.NativeMethods.WndProc | |
return (WndProc) Delegate.CreateDelegate(typeof(WndProc), proc.Target, proc.Method); | |
} | |
class SnifferNativeWindow : NativeWindow | |
{ | |
public SnifferNativeWindow(Control ctrl) | |
{ | |
AssignHandle(ctrl.Handle); | |
} | |
protected override void WndProc(ref Message m) | |
{ | |
Console.WriteLine("Native hWnd; {0}, Msg: {1}, wParam: {2}, lParam: {3}", m.HWnd, (WindowsMessage)m.Msg, m.WParam, m.LParam); | |
if (m.Msg == (int)WindowsMessage.WM_DESTROY) | |
ReleaseHandle(); | |
base.WndProc(ref m); | |
} | |
} | |
public enum WindowsMessage | |
{ | |
WM_NULL = 0x0000, | |
WM_CREATE = 0x0001, | |
WM_DESTROY = 0x0002, | |
WM_MOVE = 0x0003, | |
WM_SIZE = 0x0005, | |
WM_ACTIVATE = 0x0006, | |
WM_SETFOCUS = 0x0007, | |
WM_KILLFOCUS = 0x0008, | |
WM_ENABLE = 0x000A, | |
WM_SETREDRAW = 0x000B, | |
WM_SETTEXT = 0x000C, | |
WM_GETTEXT = 0x000D, | |
WM_GETTEXTLENGTH = 0x000E, | |
WM_PAINT = 0x000F, | |
WM_CLOSE = 0x0010, | |
WM_QUERYENDSESSION = 0x0011, | |
WM_QUERYOPEN = 0x0013, | |
WM_ENDSESSION = 0x0016, | |
WM_QUIT = 0x0012, | |
WM_ERASEBKGND = 0x0014, | |
WM_SYSCOLORCHANGE = 0x0015, | |
WM_SHOWWINDOW = 0x0018, | |
WM_WININICHANGE = 0x001A, | |
WM_SETTINGCHANGE = WM_WININICHANGE, | |
WM_DEVMODECHANGE = 0x001B, | |
WM_ACTIVATEAPP = 0x001C, | |
WM_FONTCHANGE = 0x001D, | |
WM_TIMECHANGE = 0x001E, | |
WM_CANCELMODE = 0x001F, | |
WM_SETCURSOR = 0x0020, | |
WM_MOUSEACTIVATE = 0x0021, | |
WM_CHILDACTIVATE = 0x0022, | |
WM_QUEUESYNC = 0x0023, | |
WM_GETMINMAXINFO = 0x0024, | |
WM_PAINTICON = 0x0026, | |
WM_ICONERASEBKGND = 0x0027, | |
WM_NEXTDLGCTL = 0x0028, | |
WM_SPOOLERSTATUS = 0x002A, | |
WM_DRAWITEM = 0x002B, | |
WM_MEASUREITEM = 0x002C, | |
WM_DELETEITEM = 0x002D, | |
WM_VKEYTOITEM = 0x002E, | |
WM_CHARTOITEM = 0x002F, | |
WM_SETFONT = 0x0030, | |
WM_GETFONT = 0x0031, | |
WM_SETHOTKEY = 0x0032, | |
WM_GETHOTKEY = 0x0033, | |
WM_QUERYDRAGICON = 0x0037, | |
WM_COMPAREITEM = 0x0039, | |
WM_GETOBJECT = 0x003D, | |
WM_COMPACTING = 0x0041, | |
WM_COMMNOTIFY = 0x0044, | |
WM_WINDOWPOSCHANGING = 0x0046, | |
WM_WINDOWPOSCHANGED = 0x0047, | |
WM_POWER = 0x0048, | |
WM_COPYDATA = 0x004A, | |
WM_CANCELJOURNAL = 0x004B, | |
WM_NOTIFY = 0x004E, | |
WM_INPUTLANGCHANGEREQUEST = 0x0050, | |
WM_INPUTLANGCHANGE = 0x0051, | |
WM_TCARD = 0x0052, | |
WM_HELP = 0x0053, | |
WM_USERCHANGED = 0x0054, | |
WM_NOTIFYFORMAT = 0x0055, | |
WM_CONTEXTMENU = 0x007B, | |
WM_STYLECHANGING = 0x007C, | |
WM_STYLECHANGED = 0x007D, | |
WM_DISPLAYCHANGE = 0x007E, | |
WM_GETICON = 0x007F, | |
WM_SETICON = 0x0080, | |
WM_NCCREATE = 0x0081, | |
WM_NCDESTROY = 0x0082, | |
WM_NCCALCSIZE = 0x0083, | |
WM_NCHITTEST = 0x0084, | |
WM_NCPAINT = 0x0085, | |
WM_NCACTIVATE = 0x0086, | |
WM_GETDLGCODE = 0x0087, | |
WM_SYNCPAINT = 0x0088, | |
WM_UAHDESTROYWINDOW = 0x0090, | |
WM_UAHDRAWMENU = 0x0091, | |
WM_UAHDRAWMENUITEM = 0x0092, | |
WM_UAHINITMENU = 0x0093, | |
WM_UAHMEASUREMENUITEM = 0x0094, | |
WM_UAHNCPAINTMENUPOPUP = 0x0095, | |
WM_NCMOUSEMOVE = 0x00A0, | |
WM_NCLBUTTONDOWN = 0x00A1, | |
WM_NCLBUTTONUP = 0x00A2, | |
WM_NCLBUTTONDBLCLK = 0x00A3, | |
WM_NCRBUTTONDOWN = 0x00A4, | |
WM_NCRBUTTONUP = 0x00A5, | |
WM_NCRBUTTONDBLCLK = 0x00A6, | |
WM_NCMBUTTONDOWN = 0x00A7, | |
WM_NCMBUTTONUP = 0x00A8, | |
WM_NCMBUTTONDBLCLK = 0x00A9, | |
WM_NCXBUTTONDOWN = 0x00AB, | |
WM_NCXBUTTONUP = 0x00AC, | |
WM_NCXBUTTONDBLCLK = 0x00AD, | |
WM_NCUAHDRAWCAPTION = 0x00AE, | |
WM_NCUAHDRAWFRAME = 0x00AF, | |
WM_INPUT_DEVICE_CHANGE = 0x00FE, | |
WM_INPUT = 0x00FF, | |
WM_KEYFIRST = 0x0100, | |
WM_KEYDOWN = 0x0100, | |
WM_KEYUP = 0x0101, | |
WM_CHAR = 0x0102, | |
WM_DEADCHAR = 0x0103, | |
WM_SYSKEYDOWN = 0x0104, | |
WM_SYSKEYUP = 0x0105, | |
WM_SYSCHAR = 0x0106, | |
WM_SYSDEADCHAR = 0x0107, | |
WM_UNICHAR = 0x0109, | |
WM_KEYLAST = 0x0109, | |
WM_IME_STARTCOMPOSITION = 0x010D, | |
WM_IME_ENDCOMPOSITION = 0x010E, | |
WM_IME_COMPOSITION = 0x010F, | |
WM_IME_KEYLAST = 0x010F, | |
WM_INITDIALOG = 0x0110, | |
WM_COMMAND = 0x0111, | |
WM_SYSCOMMAND = 0x0112, | |
WM_TIMER = 0x0113, | |
WM_HSCROLL = 0x0114, | |
WM_VSCROLL = 0x0115, | |
WM_INITMENU = 0x0116, | |
WM_INITMENUPOPUP = 0x0117, | |
WM_MENUSELECT = 0x011F, | |
WM_MENUCHAR = 0x0120, | |
WM_ENTERIDLE = 0x0121, | |
WM_MENURBUTTONUP = 0x0122, | |
WM_MENUDRAG = 0x0123, | |
WM_MENUGETOBJECT = 0x0124, | |
WM_UNINITMENUPOPUP = 0x0125, | |
WM_MENUCOMMAND = 0x0126, | |
WM_CHANGEUISTATE = 0x0127, | |
WM_UPDATEUISTATE = 0x0128, | |
WM_QUERYUISTATE = 0x0129, | |
WM_CTLCOLORMSGBOX = 0x0132, | |
WM_CTLCOLOREDIT = 0x0133, | |
WM_CTLCOLORLISTBOX = 0x0134, | |
WM_CTLCOLORBTN = 0x0135, | |
WM_CTLCOLORDLG = 0x0136, | |
WM_CTLCOLORSCROLLBAR = 0x0137, | |
WM_CTLCOLORSTATIC = 0x0138, | |
MN_GETHMENU = 0x01E1, | |
WM_MOUSEFIRST = 0x0200, | |
WM_MOUSEMOVE = 0x0200, | |
WM_LBUTTONDOWN = 0x0201, | |
WM_LBUTTONUP = 0x0202, | |
WM_LBUTTONDBLCLK = 0x0203, | |
WM_RBUTTONDOWN = 0x0204, | |
WM_RBUTTONUP = 0x0205, | |
WM_RBUTTONDBLCLK = 0x0206, | |
WM_MBUTTONDOWN = 0x0207, | |
WM_MBUTTONUP = 0x0208, | |
WM_MBUTTONDBLCLK = 0x0209, | |
WM_MOUSEWHEEL = 0x020A, | |
WM_XBUTTONDOWN = 0x020B, | |
WM_XBUTTONUP = 0x020C, | |
WM_XBUTTONDBLCLK = 0x020D, | |
WM_MOUSEHWHEEL = 0x020E, | |
WM_PARENTNOTIFY = 0x0210, | |
WM_ENTERMENULOOP = 0x0211, | |
WM_EXITMENULOOP = 0x0212, | |
WM_NEXTMENU = 0x0213, | |
WM_SIZING = 0x0214, | |
WM_CAPTURECHANGED = 0x0215, | |
WM_MOVING = 0x0216, | |
WM_POWERBROADCAST = 0x0218, | |
WM_DEVICECHANGE = 0x0219, | |
WM_MDICREATE = 0x0220, | |
WM_MDIDESTROY = 0x0221, | |
WM_MDIACTIVATE = 0x0222, | |
WM_MDIRESTORE = 0x0223, | |
WM_MDINEXT = 0x0224, | |
WM_MDIMAXIMIZE = 0x0225, | |
WM_MDITILE = 0x0226, | |
WM_MDICASCADE = 0x0227, | |
WM_MDIICONARRANGE = 0x0228, | |
WM_MDIGETACTIVE = 0x0229, | |
WM_MDISETMENU = 0x0230, | |
WM_ENTERSIZEMOVE = 0x0231, | |
WM_EXITSIZEMOVE = 0x0232, | |
WM_DROPFILES = 0x0233, | |
WM_MDIREFRESHMENU = 0x0234, | |
WM_IME_SETCONTEXT = 0x0281, | |
WM_IME_NOTIFY = 0x0282, | |
WM_IME_CONTROL = 0x0283, | |
WM_IME_COMPOSITIONFULL = 0x0284, | |
WM_IME_SELECT = 0x0285, | |
WM_IME_CHAR = 0x0286, | |
WM_IME_REQUEST = 0x0288, | |
WM_IME_KEYDOWN = 0x0290, | |
WM_IME_KEYUP = 0x0291, | |
WM_MOUSEHOVER = 0x02A1, | |
WM_MOUSELEAVE = 0x02A3, | |
WM_NCMOUSEHOVER = 0x02A0, | |
WM_NCMOUSELEAVE = 0x02A2, | |
WM_WTSSESSION_CHANGE = 0x02B1, | |
WM_TABLET_FIRST = 0x02c0, | |
WM_TABLET_LAST = 0x02df, | |
WM_CUT = 0x0300, | |
WM_COPY = 0x0301, | |
WM_PASTE = 0x0302, | |
WM_CLEAR = 0x0303, | |
WM_UNDO = 0x0304, | |
WM_RENDERFORMAT = 0x0305, | |
WM_RENDERALLFORMATS = 0x0306, | |
WM_DESTROYCLIPBOARD = 0x0307, | |
WM_DRAWCLIPBOARD = 0x0308, | |
WM_PAINTCLIPBOARD = 0x0309, | |
WM_VSCROLLCLIPBOARD = 0x030A, | |
WM_SIZECLIPBOARD = 0x030B, | |
WM_ASKCBFORMATNAME = 0x030C, | |
WM_CHANGECBCHAIN = 0x030D, | |
WM_HSCROLLCLIPBOARD = 0x030E, | |
WM_QUERYNEWPALETTE = 0x030F, | |
WM_PALETTEISCHANGING = 0x0310, | |
WM_PALETTECHANGED = 0x0311, | |
WM_HOTKEY = 0x0312, | |
WM_PRINT = 0x0317, | |
WM_PRINTCLIENT = 0x0318, | |
WM_APPCOMMAND = 0x0319, | |
WM_THEMECHANGED = 0x031A, | |
WM_CLIPBOARDUPDATE = 0x031D, | |
WM_DWMCOMPOSITIONCHANGED = 0x031E, | |
WM_DWMNCRENDERINGCHANGED = 0x031F, | |
WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320, | |
WM_DWMWINDOWMAXIMIZEDCHANGE = 0x0321, | |
WM_GETTITLEBARINFOEX = 0x033F, | |
WM_HANDHELDFIRST = 0x0358, | |
WM_HANDHELDLAST = 0x035F, | |
WM_AFXFIRST = 0x0360, | |
WM_AFXLAST = 0x037F, | |
WM_PENWINFIRST = 0x0380, | |
WM_PENWINLAST = 0x038F, | |
WM_APP = 0x8000, | |
WM_USER = 0x0400, | |
WM_REFLECT = WM_USER + 0x1C00, | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment