/// <summary> /// 取消revit操作 /// </summary> public static void CancelRevitOperate() { byte bVk = 27; int dwFlags = 0; int dwFlags2 = 2; MethodForWin32.keybd_event(bVk, 0, dwFlags, 0); MethodForWin32.keybd_event(bVk, 0, dwFlags2, 0); }
/// <summary> /// 弹窗位置随revit /// </summary> public System.Drawing.Point GetPointX(IntPtr intPtr) { LocationRect rect = new LocationRect(); // IntPtr ptr = comboxHandle.Mng.SearchDialog(intPtr, "MDIClient", 0); var mdi = MethodForWin32.FindWindowEx(intPtr, IntPtr.Zero, "MDIClient", null); GetWindowRect(mdi, ref rect); int width = rect.Right - rect.Left; int height = rect.Bottom - rect.Top; int x = rect.Left; int y = rect.Top; return(new System.Drawing.Point(x, y)); }
/// <summary> /// 加载钩子 /// </summary> public void SetHook() { if (KeyboardHookProcdelegate == null) { KeyboardHookDelegate = new MethodForWin32.HookProc(KeyboardHookProc); } else { KeyboardHookDelegate = new MethodForWin32.HookProc(KeyboardHookProcdelegate); } Process cProcess = Process.GetCurrentProcess(); ProcessModule cModule = cProcess.MainModule; var mh = MethodForWin32.GetModuleHandle(cModule.ModuleName); hHook = MethodForWin32.SetWindowsHookEx(MethodForWin32.WH_KEYBOARD_LL, KeyboardHookDelegate, mh, 0); }
private List <Keys> preKeysList = new List <Keys>();//存放被按下的控制键,用来生成具体的键 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { try { Keys keyData = new Keys(); //如果该消息被丢弃(nCode<0)或者没有事件绑定处理程序则不会触发事件 if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null)) { MethodForWin32.KeyboardHookStruct KeyDataFromHook = (MethodForWin32.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(MethodForWin32.KeyboardHookStruct)); keyData = (Keys)KeyDataFromHook.vkCode; //按下控制键 if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == MethodForWin32.WM_KEYDOWN || wParam == MethodForWin32.WM_SYSKEYDOWN)) { if (IsCtrlAltShiftKeys(keyData) && preKeysList.IndexOf(keyData) == -1) { preKeysList.Add(keyData); } } //WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件 if (OnKeyDownEvent != null && (wParam == MethodForWin32.WM_KEYDOWN || wParam == MethodForWin32.WM_SYSKEYDOWN)) { KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData)); int reslut = OnKeyDownEvent(this, e); if (reslut == 1) { return(1); } } //WM_KEYDOWN消息将引发OnKeyPressEvent if (OnKeyPressEvent != null && wParam == MethodForWin32.WM_KEYDOWN) { byte[] keyState = new byte[256]; MethodForWin32.GetKeyboardState(keyState); byte[] inBuffer = new byte[2]; if (MethodForWin32.ToAscii(KeyDataFromHook.vkCode, KeyDataFromHook.scanCode, keyState, inBuffer, KeyDataFromHook.flags) == 1) { KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]); OnKeyPressEvent(this, e); } } //松开控制键 if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == MethodForWin32.WM_KEYUP || wParam == MethodForWin32.WM_SYSKEYUP)) { if (IsCtrlAltShiftKeys(keyData)) { for (int i = preKeysList.Count - 1; i >= 0; i--) { if (preKeysList[i] == keyData) { preKeysList.RemoveAt(i); } } } } //WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件 if (OnKeyUpEvent != null && (wParam == MethodForWin32.WM_KEYUP || wParam == MethodForWin32.WM_SYSKEYUP)) { KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData)); OnKeyUpEvent(this, e); } } if (KeyList.Count > 0) { bool keyFlag = false; foreach (var key in KeyList) { if (keyData == key) { keyFlag = true; break; } } if (keyFlag) { return(1); } else { return(MethodForWin32.CallNextHookEx(hHook, nCode, wParam, lParam)); } } else { return(MethodForWin32.CallNextHookEx(hHook, nCode, wParam, lParam)); } } catch (Exception ex) { UnHook(); throw new Exception("获取按键信息异常"); } }
/// <summary> /// 卸载钩子 /// </summary> public void UnHook() { MethodForWin32.UnhookWindowsHookEx(hHook); }
/// <summary> /// 设置revit焦点 /// </summary> public static void SetFocusToRevit(IntPtr handle) { int wMsg = 7; MethodForWin32.SendMessage(handle, wMsg, IntPtr.Zero, IntPtr.Zero); }