using System.Diagnostics; using System.Runtime.InteropServices; using System.Text; using Autodesk.Windows; namespace ShrlAlgo.Addin.Test; /// /// 全局鼠标监视器类,用于监视全局鼠标事件。 /// internal class GlobalMouseWatcher { private const int WH_MOUSE_LL = 14; private const int WM_LBUTTONDOWN = 0x0201; private const int WM_RBUTTONDOWN = 0x0204; private IntPtr _hookID = IntPtr.Zero; /// /// 构造函数,设置鼠标钩子。 /// public GlobalMouseWatcher() { _hookID = SetHook(MouseHookCallback); } /// /// 析构函数,移除鼠标钩子。 /// ~GlobalMouseWatcher() { UnhookWindowsHookEx(_hookID); } /// /// 设置鼠标钩子。 /// /// 钩子过程。 /// 钩子的句柄。 private IntPtr SetHook(HookProc proc) { using (var curProcess = Process.GetCurrentProcess()) using (var curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } /// /// 钩子过程的委托。 /// private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); /// /// 鼠标钩子回调函数。 /// private IntPtr MouseHookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_RBUTTONDOWN) { CompleteMultiSelection(); } return CallNextHookEx(_hookID, nCode, wParam, lParam); } #region Win32 API [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); [DllImport("user32.dll", CharSet = CharSet.None, ExactSpelling = false)] private static extern bool EnumChildWindows(IntPtr hwndParent, CallBack lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")] private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpText, int nCount); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); #endregion /// /// 回调函数的委托。 /// public delegate bool CallBack(IntPtr hwnd, int lParam); /// /// 完成多选操作。 /// private static void CompleteMultiSelection() { var rvtwindow = ComponentManager.ApplicationWindow; var list = new List(); var flag = EnumChildWindows( rvtwindow, (hwnd, l) => { var windowText = new StringBuilder(200); GetWindowText(hwnd, windowText, windowText.Capacity); var className = new StringBuilder(200); GetClassName(hwnd, className, className.Capacity); if ( ( windowText.ToString().Equals("完成", StringComparison.Ordinal) || windowText.ToString().Equals("Finish", StringComparison.Ordinal) ) && className.ToString().Contains("Button") ) { list.Add(hwnd); return false; } return true; }, new IntPtr(0) ); var complete = list.FirstOrDefault(); SendMessage(complete, 245, 0, 0); } }