-

- 加为好友
- 发送私信
- 在线聊天
-
skyljp
- 等级:

- 可用分等级:
- 总技术专家分:
- 总技术专家分排名:
- 揭帖率:
|
| 发表于:2008-06-07 17:14:29 楼主 |
小弟最近在做一个基于控制台下的文本编辑器,就是像eidt那样的东西,现在做的七七八八了。不过现在想用快捷键的来进行保存,粘贴,复制等操作。可惜不会获取组合键,经过baidu,google,msdn遍历仍不得解。心中甚为郁闷啊。特此来求教。 我在msdn上整了段例子和着网上的东西自己又改了改如下: 程序太长,大侠们复制下来看吧,问题在程序注释里,等待大虾们的佳音啦。哈哈。。。。 #include <windows.h> #include <stdio.h> void ErrorExit (LPSTR lpszMessage); int main(void) { HANDLE hStdin; DWORD cNumRead, fdwMode, i; INPUT_RECORD irInBuf[1]; int counter=0; hStdin = GetStdHandle(STD_INPUT_HANDLE); while (counter++ <= 100) { if (! ReadConsoleInput(hStdin,irInBuf,1,&cNumRead) ) //读入键盘输入 ErrorExit(TEXT("ReadConsoleInput")); for (i = 0; i < cNumRead; i++) { switch(irInBuf[i].EventType) { //这里我只处理上下左右键,ctrl+x,ctrl+v,ctrl+s的快捷键,鼠标移动的回应。 //问题一:主要是下面这个的情况,我输入ctrl+x,ctrl+v等组合键后理论上 //irInBuf[].Event.KeyEvent.uChar.AsciiChar中应该是's'等字符吧 //可结果irInBuf[i].Event.KeyEvent.uChar.AsciiChar中存放的是某些控制字符. //第二个问题是:为什么下面用按位与。 //看程序似乎感觉想起到 == 这个运算符的作用,可情况不是这样。 //这程序是总和网上多个例子整出来的,具体也不知出自哪里。 //但单个键,如上下左右键的反应倒是正常的。 case KEY_EVENT: // keyboard input if(irInBuf[i].Event.KeyEvent.bKeyDown ) { if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_DOWN) printf("BACK\n"); if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_UP) printf("UP\n"); if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_RIGHT) printf("RIGHT\n"); if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_LEFT) printf("LEFT\n"); //下面为什么用按位与呢? if((irInBuf[i].Event.KeyEvent.uChar.AsciiChar & 'v') && (irInBuf[i].Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED)) printf("AsciiChar 的值是 %d\n",irInBuf[i].Event.KeyEvent.uChar.AsciiChar); //输出irInBuf[i].Event.KeyEvent.uChar.AsciiChar的值 if((irInBuf[i].Event.KeyEvent.uChar.AsciiChar &'x') && (irInBuf[i].Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED)) printf("AsciiChar 的值是 %d\n",irInBuf[i].Event.KeyEvent.uChar.AsciiChar); if((irInBuf[i].Event.KeyEvent.uChar.AsciiChar & 'a') && (irInBuf[i].Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED)) printf("AsciiChar 的值是 %d\n",irInBuf[i].Event.KeyEvent.uChar.AsciiChar); } break; case MOUSE_EVENT: // mouse input printf("mouse_event\n"); case FOCUS_EVENT: // disregard focus events case MENU_EVENT: // disregard menu events break; default: ErrorExit(TEXT("Unknown event type")); break; } } } return 0; } void ErrorExit (LPSTR lpszMessage) { fprintf(stderr, "%s\n", lpszMessage); ExitProcess(0); } |
|
|
|
80
修改
删除
举报
引用
回复
| |