⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdinput.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 2 页
字号:
			case VK_HOME:
				/* goto beginning of string */
				if (current != 0)
				{
					SetCursorXY (orgx, orgy);
					curx = orgx;
					cury = orgy;
					current = 0;
				}
				break;

			case VK_END:
				/* goto end of string */
				if (current != charcount)
				{
					SetCursorXY (orgx, orgy);
					ConOutPrintf (_T("%s"), str);
					GetCursorXY (&curx, &cury);
					current = charcount;
				}
				break;

			case VK_TAB:
#ifdef FEATURE_UNIX_FILENAME_COMPLETION
				/* expand current file name */
				if ((current == charcount) ||
				    (current == charcount - 1 &&
				     str[current] == _T('"'))) /* only works at end of line*/
				{
					if (wLastKey != VK_TAB)
					{
						/* if first TAB, complete filename*/
						tempscreen = charcount;
						CompleteFilename (str, charcount);
						charcount = _tcslen (str);
						current = charcount;

						SetCursorXY (orgx, orgy);
						ConOutPrintf (_T("%s"), str);

						if (tempscreen > charcount)
						{
							GetCursorXY (&curx, &cury);
							for (count = tempscreen - charcount; count--; )
								ConOutChar (_T(' '));
							SetCursorXY (curx, cury);
						}
						else
						{
							if (((charcount + orgx) / maxx) + orgy > maxy - 1)
								orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
						}

						/* set cursor position */
						SetCursorXY ((orgx + current) % maxx,
							     orgy + (orgx + current) / maxx);
						GetCursorXY (&curx, &cury);
					}
					else
					{
						/*if second TAB, list matches*/
						if (ShowCompletionMatches (str, charcount))
						{
							PrintPrompt ();
							GetCursorXY (&orgx, &orgy);
							ConOutPrintf (_T("%s"), str);

							/* set cursor position */
							SetCursorXY ((orgx + current) % maxx,
								     orgy + (orgx + current) / maxx);
							GetCursorXY (&curx, &cury);
						}

					}
				}
				else
				{
					MessageBeep (-1);
				}
#endif
#ifdef FEATURE_4NT_FILENAME_COMPLETION
				
				/* used to later see if we went down to the next line */
				tempscreen = charcount;
				szPath[0]=_T('\0');

				/* str is the whole things that is on the current line 
				   that is and and out.  arg 2 is weather it goes back
					one file or forward one file */
				CompleteFilename(str, !(ir.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED), szPath, current);
				/* Attempt to clear the line */
				ClearCommandLine (str, maxlen, orgx, orgy);
				curx = orgx;
				cury = orgy;
				current = charcount = 0;				
        //str[0]=_T('\0');
				
				/* Everything is deleted, lets add it back in */
				_tcscpy(str,szPath);
        
				/* Figure out where cusor is going to be after we print it */
				charcount = _tcslen (str);
				current = charcount;

				SetCursorXY (orgx, orgy);
				/* Print out what we have now */
				ConOutPrintf (_T("%s"), str);

				/* Move cursor accordingly */
				if(tempscreen > charcount)
				{
					GetCursorXY (&curx, &cury);
					for(count = tempscreen - charcount; count--; )
						ConOutChar (_T(' '));
					SetCursorXY (curx, cury);
				}
				else
				{
					if(((charcount + orgx) / maxx) + orgy > maxy - 1)
						orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
				}
				SetCursorXY((short)(((int)orgx + current) % maxx), (short)((int)orgy + ((int)orgx + current) / maxx));
				GetCursorXY(&curx, &cury);

#endif
				break;
            
            case _T('M'):
            case _T('C'):
                /* ^M does the same as return */
                bCharInput = TRUE;
                if(!(ir.Event.KeyEvent.dwControlKeyState &
                   (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)))
                {
                    break;
                }
                    
			case VK_RETURN:
				/* end input, return to main */
#ifdef FEATURE_HISTORY
				/* add to the history */
				if (str[0])
					History (0, str);
#endif
				ConInDummy ();
				ConOutChar (_T('\n'));
                bReturn = TRUE;
				break;

			case VK_ESCAPE:
				/* clear str  Make this callable! */
				ClearCommandLine (str, maxlen, orgx, orgy);
				curx = orgx;
				cury = orgy;
				current = charcount = 0;
				break;

#ifdef FEATURE_HISTORY
			case VK_F3:
				History_move_to_bottom();
#endif
			case VK_UP:
#ifdef FEATURE_HISTORY
				/* get previous command from buffer */
				ClearCommandLine (str, maxlen, orgx, orgy);
				History (-1, str);
				current = charcount = _tcslen (str);
				if (((charcount + orgx) / maxx) + orgy > maxy - 1)
					orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
				ConOutPrintf (_T("%s"), str);
				GetCursorXY (&curx, &cury);
#endif
				break;

			case VK_DOWN:
#ifdef FEATURE_HISTORY
				/* get next command from buffer */
				ClearCommandLine (str, maxlen, orgx, orgy);
				History (1, str);
				current = charcount = _tcslen (str);
				if (((charcount + orgx) / maxx) + orgy > maxy - 1)
					orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
				ConOutPrintf (_T("%s"), str);
				GetCursorXY (&curx, &cury);
#endif
				break;

			case VK_LEFT:
				/* move cursor left */
				if (current > 0)
				{
					current--;
					if (GetCursorX () == 0)
					{
						SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
						curx = maxx - 1;
						cury--;
					}
					else
					{
						SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ());
						curx--;
					}
				}
				else
				{
					MessageBeep (-1);
				}
				break;

			case VK_RIGHT:
				/* move cursor right */
				if (current != charcount)
				{
					current++;
					if (GetCursorX () == maxx - 1)
					{
						SetCursorXY (0, (SHORT)(GetCursorY () + 1));
						curx = 0;
						cury++;
					}
					else
					{
						SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ());
						curx++;
					}
				}
				break;

            default:
                /* This input is just a normal char */
                bCharInput = TRUE;

			}
#ifdef _UNICODE
            ch = ir.Event.KeyEvent.uChar.UnicodeChar;
            if (ch >= 32 && (charcount != (maxlen - 2)) && bCharInput)
#else
            ch = ir.Event.KeyEvent.uChar.AsciiChar;
            if ((UCHAR)ch >= 32 && (charcount != (maxlen - 2)) && bCharInput)
#endif /* _UNICODE */
            {
                /* insert character into string... */
                if (bInsert && current != charcount)
                {
                        /* If this character insertion will cause screen scrolling,
                                                                 * adjust the saved origin of the command prompt. */
                        tempscreen = _tcslen(str + current) + curx;
                    if ((tempscreen % maxx) == (maxx - 1) &&
                        (tempscreen / maxx) + cury == (maxy - 1))
                    {
                        orgy--;
                        cury--;
                    }

                    for (count = charcount; count > current; count--)
                        str[count] = str[count - 1];
                    str[current++] = ch;
                    if (curx == maxx - 1)
                        curx = 0, cury++;
                    else
                        curx++;
                    ConOutPrintf (_T("%s"), &str[current - 1]);
                    SetCursorXY (curx, cury);
                    charcount++;
                }
                else
                {
                    if (current == charcount)
                        charcount++;
                    str[current++] = ch;
                    if (GetCursorX () == maxx - 1 && GetCursorY () == maxy - 1)
                        orgy--, cury--;
                    if (GetCursorX () == maxx - 1)
                        curx = 0, cury++;
                    else
                        curx++;
                    ConOutChar (ch);
                }
            }
		
		wLastKey = ir.Event.KeyEvent.wVirtualKeyCode;
	}
	while (!bReturn);

	SetCursorType (bInsert, TRUE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -