コード例 #1
0
 private static void CacheKeyEvent(ConsoleControl.KEY_EVENT_RECORD input, ref ConsoleControl.KEY_EVENT_RECORD cache)
 {
     if (input.RepeatCount > 1)
     {
         cache             = input;
         cache.RepeatCount = (ushort)(cache.RepeatCount - 1);
     }
 }
コード例 #2
0
        public override KeyInfo ReadKey(ReadKeyOptions options)
        {
            KeyInfo keyInfo;

            if ((options & (ReadKeyOptions.IncludeKeyDown | ReadKeyOptions.IncludeKeyUp)) != 0)
            {
                if (this.cachedKeyEvent.RepeatCount > 0)
                {
                    if ((options & ReadKeyOptions.AllowCtrlC) != 0 || this.cachedKeyEvent.UnicodeChar != '\u0003')
                    {
                        if ((options & ReadKeyOptions.IncludeKeyUp) == 0 && !this.cachedKeyEvent.KeyDown || (options & ReadKeyOptions.IncludeKeyDown) == 0 && this.cachedKeyEvent.KeyDown)
                        {
                            this.cachedKeyEvent.RepeatCount = 0;
                        }
                    }
                    else
                    {
                        ConsoleControl.KEY_EVENT_RECORD kEYEVENTRECORDPointer = this.cachedKeyEvent;
                        this.cachedKeyEvent.RepeatCount = (ushort)(this.cachedKeyEvent.RepeatCount - 1);
                        throw this.NewPipelineStoppedException();
                    }
                }
                if (this.cachedKeyEvent.RepeatCount <= 0)
                {
                    SafeFileHandle inputHandle = ConsoleControl.GetInputHandle();
                    ConsoleControl.INPUT_RECORD[] nPUTRECORDArray = new ConsoleControl.INPUT_RECORD[1];
                    ConsoleControl.ConsoleModes   mode            = ConsoleControl.GetMode(inputHandle);
                    ConsoleControl.ConsoleModes   consoleMode     = mode & (ConsoleControl.ConsoleModes.ProcessedInput | ConsoleControl.ConsoleModes.LineInput | ConsoleControl.ConsoleModes.EchoInput | ConsoleControl.ConsoleModes.MouseInput | ConsoleControl.ConsoleModes.Insert | ConsoleControl.ConsoleModes.QuickEdit | ConsoleControl.ConsoleModes.Extended | ConsoleControl.ConsoleModes.AutoPosition | ConsoleControl.ConsoleModes.ProcessedOutput | ConsoleControl.ConsoleModes.WrapEndOfLine) & (ConsoleControl.ConsoleModes.ProcessedInput | ConsoleControl.ConsoleModes.LineInput | ConsoleControl.ConsoleModes.EchoInput | ConsoleControl.ConsoleModes.WindowInput | ConsoleControl.ConsoleModes.Insert | ConsoleControl.ConsoleModes.QuickEdit | ConsoleControl.ConsoleModes.Extended | ConsoleControl.ConsoleModes.AutoPosition | ConsoleControl.ConsoleModes.ProcessedOutput | ConsoleControl.ConsoleModes.WrapEndOfLine) & (ConsoleControl.ConsoleModes.LineInput | ConsoleControl.ConsoleModes.EchoInput | ConsoleControl.ConsoleModes.WindowInput | ConsoleControl.ConsoleModes.MouseInput | ConsoleControl.ConsoleModes.Insert | ConsoleControl.ConsoleModes.QuickEdit | ConsoleControl.ConsoleModes.Extended | ConsoleControl.ConsoleModes.AutoPosition | ConsoleControl.ConsoleModes.WrapEndOfLine);
                    try
                    {
                        ConsoleControl.SetMode(inputHandle, consoleMode);
                        do
                        {
Label0:
                            int num = ConsoleControl.ReadConsoleInput(inputHandle, ref nPUTRECORDArray);
                            if (num == 1 && nPUTRECORDArray[0].EventType == 1 && nPUTRECORDArray[0].KeyEvent.RepeatCount != 0)
                            {
                                if ((options & ReadKeyOptions.AllowCtrlC) != 0 || nPUTRECORDArray[0].KeyEvent.UnicodeChar != '\u0003')
                                {
                                    continue;
                                }
                                ConsoleHostRawUserInterface.CacheKeyEvent(nPUTRECORDArray[0].KeyEvent, ref this.cachedKeyEvent);
                                throw this.NewPipelineStoppedException();
                            }
                            else
                            {
                                goto Label0;
                            }
                        }while (((options & ReadKeyOptions.IncludeKeyDown) == 0 || !nPUTRECORDArray[0].KeyEvent.KeyDown) && ((options & ReadKeyOptions.IncludeKeyUp) == 0 || nPUTRECORDArray[0].KeyEvent.KeyDown));
                        ConsoleHostRawUserInterface.CacheKeyEvent(nPUTRECORDArray[0].KeyEvent, ref this.cachedKeyEvent);
                        ConsoleHostRawUserInterface.KEY_EVENT_RECORDToKeyInfo(nPUTRECORDArray[0].KeyEvent, out keyInfo);
                    }
                    finally
                    {
                        ConsoleControl.SetMode(inputHandle, mode);
                    }
                }
                else
                {
                    ConsoleHostRawUserInterface.KEY_EVENT_RECORDToKeyInfo(this.cachedKeyEvent, out keyInfo);
                    this.cachedKeyEvent.RepeatCount = (ushort)(this.cachedKeyEvent.RepeatCount - 1);
                }
                if ((options & ReadKeyOptions.NoEcho) == 0)
                {
                    char character = keyInfo.Character;
                    this.parent.WriteToConsole(character.ToString(CultureInfo.CurrentCulture), true);
                }
                return(keyInfo);
            }
            else
            {
                throw PSTraceSource.NewArgumentException("options", "ConsoleHostRawUserInterfaceStrings", "InvalidReadKeyOptionsError", new object[0]);
            }
        }
コード例 #3
0
 private static void KEY_EVENT_RECORDToKeyInfo(ConsoleControl.KEY_EVENT_RECORD keyEventRecord, out KeyInfo keyInfo)
 {
     keyInfo = new KeyInfo(keyEventRecord.VirtualKeyCode, keyEventRecord.UnicodeChar, (ControlKeyStates)keyEventRecord.ControlKeyState, keyEventRecord.KeyDown);
 }