private int _HookProc(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && (HookEvent != null || gbTrace)) { User.Struct.CWPSTRUCT cwp = (User.Struct.CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(User.Struct.CWPSTRUCT)); User.WM message = Messages.GetWindowMessage(cwp.message); if (gbTrace) { string sMessage = message.ToString(); if (message == User.WM.WM_UNKNOW) { sMessage += " (" + cwp.message.ToString("x") + ")"; } string sCode; if (nCode == User.Const.HC_ACTION) { sCode = "HC_ACTION"; } else { sCode = nCode.ToString(); } pb.Trace.WriteLine("PreWindowHook : {0,-20} {1,-11} wParam {2,-8:x} wParam {3,-8:x} lParam {4,-8:x} hwnd {5:x}", sMessage, sCode, (int)wParam, (int)cwp.wParam, (int)cwp.lParam, (int)cwp.hwnd); } if (HookEvent != null) { PreWindowHookMessage msg = new PreWindowHookMessage() { nCode = nCode, wParam = wParam, lParam = lParam, msg = cwp, wm = message }; HookEvent(msg); //if (msg.RemoveMessage) return 0; } } return(User.CallNextHookEx(gHookHandle, nCode, wParam, lParam)); }
// ParentWindow : WA_ACTIVE WA_CLICKACTIVE, SC_RESTORE // WA_ACTIVE WA_CLICKACTIVE : Active la 1ère fenêtre fille si la fenêtre mère est activée // SC_RESTORE : Désactive le changement de la 1ère fenêtre (gbDisableSetFirstWindow) // Window : WM_CLOSE, WA_ACTIVE WA_CLICKACTIVE, SC_MINIMIZE // WM_CLOSE : Supprime la fenêtre fille et active la 1ère fenêtre fille // WA_ACTIVE WA_CLICKACTIVE : Met la fenêtre fille en 1ère position // SC_MINIMIZE : Désactive SetFirstWindow et envoie SC_MINIMIZE à la fenêtre parent private void PreWindowHookProc(PreWindowHookMessage msg) { if (msg.nCode != User.Const.HC_ACTION) return; User.WA wa = User.WA.WA_UNKNOW; User.SC sc = User.SC.SC_UNKNOW; string swParam = null; if (msg.wm == User.WM.WM_ACTIVATE) { short low = msg.msg.wParam.zGetLowValue(); wa = Messages.GetWA(low); swParam = wa.ToString(); } else if (msg.wm == User.WM.WM_SYSCOMMAND) { sc = Messages.GetSC((int)msg.msg.wParam); if (sc != User.SC.SC_MINIMIZE && sc != User.SC.SC_RESTORE) return; swParam = sc.ToString(); } else if (msg.wm != User.WM.WM_CLOSE) return; WindowData window = null; window = FindWindow(msg.msg.hwnd); string sWindow; if (window == null) { sWindow = "error window not found"; if (gbTrace) pb.Trace.WriteLine("PreWindowHookProc error : {0,-20} {1,-20} window {2,-25} hWnd {3}", msg.wm, swParam, sWindow, (int)msg.msg.hwnd); return; } sWindow = window.Form.Text; if (window == gParentWindow) { if (gbTrace) pb.Trace.WriteLine("PreWindowHookProc ParentWindow : {0,-20} {1,-20} window {2,-25} hWnd {3}", msg.wm, swParam, sWindow, (int)msg.msg.hwnd); return; //switch (msg.wm) //{ // // Parent Window WA_ACTIVE WA_CLICKACTIVE : Active la 1ère fenêtre fille si la fenêtre mère est activée // case User.WM.WM_ACTIVATE: // if ((wa == User.WA.WA_ACTIVE || wa == User.WA.WA_CLICKACTIVE) && window.Form.WindowState != FormWindowState.Minimized) // { // Form firstWindow = gOrderedWindows[0]; // if (firstWindow != null) firstWindow.Activate(); // } // break; // // Parent Window SC_RESTORE : Désactive le changement de la 1ère fenêtre (gbDisableSetFirstWindow) // case User.WM.WM_SYSCOMMAND: // if (sc == User.SC.SC_RESTORE) // gbDisableSetFirstWindow = false; // break; //} } else { if (gbTrace) pb.Trace.WriteLine("PreWindowHookProc Window : {0,-20} {1,-20} window {2,-25} hWnd {3}", msg.wm, swParam, sWindow, (int)msg.msg.hwnd); return; //switch (msg.wm) //{ // // Child Window WM_CLOSE : Supprime la fenêtre fille et active la 1ère fenêtre fille // case User.WM.WM_CLOSE: // RemoveWindow(window.Form); // ActivateFirstWindow(); // break; // // Child Window WA_ACTIVE WA_CLICKACTIVE : Met la fenêtre fille en 1ère position // case User.WM.WM_ACTIVATE: // if (wa == User.WA.WA_CLICKACTIVE || wa == User.WA.WA_ACTIVE) // SetFirstWindow(window.Form); // break; // // Child Window SC_MINIMIZE : Désactive SetFirstWindow et envoie SC_MINIMIZE à la fenêtre parent // case User.WM.WM_SYSCOMMAND: // Form parentWindow = window.Form.Owner; // if (parentWindow == null) // { // if (gbTrace) pb.Trace.WriteLine("PreWindowHookProc Window error : error this window dont have parent"); // break; // } // if (sc == User.SC.SC_MINIMIZE) // { // //gbDisableSetFirstWindow = true; // //Point pt = Cursor.Position; // //User.SendMessage(parentWindow.Handle, (uint)User.WM.WM_SYSCOMMAND, (IntPtr)User.SC.SC_MINIMIZE, new IntPtr(cu.MakeValue(pt.X, pt.Y))); // //msg.RemoveMessage = true; // } // break; //} } }
private int _HookProc(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && (HookEvent != null || gbTrace)) { User.Struct.CWPSTRUCT cwp = (User.Struct.CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(User.Struct.CWPSTRUCT)); User.WM message = Messages.GetWindowMessage(cwp.message); if (gbTrace) { string sMessage = message.ToString(); if (message == User.WM.WM_UNKNOW) sMessage += " (" + cwp.message.ToString("x") + ")"; string sCode; if (nCode == User.Const.HC_ACTION) sCode = "HC_ACTION"; else sCode = nCode.ToString(); pb.Trace.CurrentTrace.WriteLine("PreWindowHook : {0,-20} {1,-11} wParam {2,-8:x} wParam {3,-8:x} lParam {4,-8:x} hwnd {5:x}", sMessage, sCode, (int)wParam, (int)cwp.wParam, (int)cwp.lParam, (int)cwp.hwnd); } if (HookEvent != null) { PreWindowHookMessage msg = new PreWindowHookMessage() { nCode = nCode, wParam = wParam, lParam = lParam, msg = cwp, wm = message }; HookEvent(msg); //if (msg.RemoveMessage) return 0; } } return User.CallNextHookEx(gHookHandle, nCode, wParam, lParam); }