private void OnGlobalKeyPressed(object sender, GlobalKeyboardHookEventArgs e) { Console.WriteLine(e.KeyboardData.VirtualCode + "(" + KeyInterop.KeyFromVirtualKey(e.KeyboardData.VirtualCode).ToString() + ") state:" + e.KeyboardState + " flag:" + e.KeyboardData.Flags.ToString("X4")); Key key = KeyInterop.KeyFromVirtualKey(e.KeyboardData.VirtualCode); bool isKeyDown = (e.KeyboardState == GlobalKeyboardHook.KeyboardState.KeyDown || e.KeyboardState == GlobalKeyboardHook.KeyboardState.SysKeyDown); bool isKeyUp = (e.KeyboardState == GlobalKeyboardHook.KeyboardState.KeyUp || e.KeyboardState == GlobalKeyboardHook.KeyboardState.SysKeyUp); bool isFlag0, isFlag1; Key key0 = CvtStringToKey(Properties.Settings.Default.GlobalHotkey0, out isFlag0); Key key1 = CvtStringToKey(Properties.Settings.Default.GlobalHotkey1, out isFlag1); bool isHit = true; if (isFlag0) { if (key0 == Key.LWin || key0 == Key.RWin) { isHit &= mIsKeyWinDown; } if (key0 == Key.LeftCtrl || key0 == Key.RightCtrl) { isHit &= mIsKeyCtrlDown; } if (key0 == Key.LeftAlt || key0 == Key.RightAlt) { isHit &= mIsKeyAltDown; } if (key0 == Key.LeftShift || key0 == Key.RightShift) { isHit &= mIsKeyShiftDown; } isHit &= (key1 == key) && isKeyDown; if (isHit && mHitState == 0) { mHitState = 2; } } else { isHit &= (key0 == key) && isKeyUp; if (isHit) { mHitState = 2; } } if (key == Key.LWin || key == Key.RWin) { if (mIsKeyWinDown && mHitState == 1 && isKeyUp) { mHitState = 2; } mIsKeyWinDown = isKeyDown; } if (key == Key.LeftCtrl || key == Key.RightCtrl) { if (mIsKeyCtrlDown && mHitState == 1 && isKeyUp) { mHitState = 2; } mIsKeyCtrlDown = isKeyDown; } if (key == Key.LeftAlt || key == Key.RightAlt) { if (mIsKeyAltDown && mHitState == 1 && isKeyUp) { mHitState = 2; } mIsKeyAltDown = isKeyDown; } if (key == Key.LeftShift || key == Key.RightShift) { mIsKeyShiftDown = isKeyDown; } Console.WriteLine("Hit " + mHitState + "(" + mIsKeyAltDown + ") keyup " + isKeyUp + " " + key0 + "+" + key1 + " Cur " + key + " alt:" + mIsKeyAltDown + " ctrl:" + mIsKeyCtrlDown + " shf:" + mIsKeyShiftDown + " win:" + mIsKeyWinDown); if (mHitState == 2) { new Thread(() => { if (Properties.Settings.Default.GlobalDelay > 0) { Thread.Sleep(Properties.Settings.Default.GlobalDelay); } Dispatcher.BeginInvoke(new Action(() => { ShowCalc(); })); }).Start(); e.Handled = true; mHitState = 0; } //if (e.KeyboardData.VirtualCode != GlobalKeyboardHook.VkSnapshot) // return; // seems, not needed in the life. //if (e.KeyboardState == GlobalKeyboardHook.KeyboardState.SysKeyDown && // e.KeyboardData.Flags == GlobalKeyboardHook.LlkhfAltdown) //{ // MessageBox.Show("Alt + Print Screen"); // e.Handled = true; //} //else //if (e.KeyboardState == GlobalKeyboardHook.KeyboardState.KeyDown) //{ // MessageBox.Show("Print Screen"); // e.Handled = true; //} }