控制台程序接收键盘消息
来源:互联网 发布:dpp软件怎么用 编辑:程序博客网 时间:2024/05/16 04:46
DOS程序通过一个名为Winoldap的控制台程序来运行,而这个程序则是在32位Windows控制台窗口中运行。原理上,Winoldap利用x86的"Virtual86"模式来虚拟实模式。
创建控制台时,操作系统自动创建三个"标准"文件句柄。在高级控制台编程中,用两个API函数控制这些句柄
GetStdHandle和SetStdHandle
控制台使用的不是我们常见的Win32消息队列,而是事件队列。
事件队列和Windows消息队列差不多,不过是接收输入事件,而非消息。所以Spy++当然得不到消息
ReadConsoleInput可以用来获得控制台的输入,参考
MSDN给出了一个创建标准信息队列的例子
我就花点事件给你解释下
WINDOW_BUFFER_SIZE_EVENT 屏幕大小改变时发出
MENU_EVENT 用户使用控制台菜单或工具栏时发出
FOCUS_EVENT 控制台得到输入焦点时发出
这是内部实现,当然我们外部也可以获得。利用管道,然后GetStdHandle(STD_INPUT_HANDLE);
然后即可读取Console窗口的事件。
//该定义用于启动钩子的结构体
#define _WIN32_WINNT 0x0400
创建控制台时,操作系统自动创建三个"标准"文件句柄。在高级控制台编程中,用两个API函数控制这些句柄
GetStdHandle和SetStdHandle
控制台使用的不是我们常见的Win32消息队列,而是事件队列。
事件队列和Windows消息队列差不多,不过是接收输入事件,而非消息。所以Spy++当然得不到消息
ReadConsoleInput可以用来获得控制台的输入,参考
MSDN给出了一个创建标准信息队列的例子
- C/C++ code
- #include <windows.h>#include <stdio.h>VOID ErrorExit(LPSTR);VOID KeyEventProc(KEY_EVENT_RECORD); VOID MouseEventProc(MOUSE_EVENT_RECORD); VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD); int main(VOID) { HANDLE hStdin; DWORD cNumRead, fdwMode, fdwSaveOldMode, i; INPUT_RECORD irInBuf[128]; int counter=0; // Get the standard input handle. hStdin = GetStdHandle(STD_INPUT_HANDLE); if (hStdin == INVALID_HANDLE_VALUE) ErrorExit("GetStdHandle"); // Save the current input mode, to be restored on exit. if (! GetConsoleMode(hStdin, &fdwSaveOldMode) ) ErrorExit("GetConsoleMode"); // Enable the window and mouse input events. fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; if (! SetConsoleMode(hStdin, fdwMode) ) ErrorExit("SetConsoleMode"); // Loop to read and handle the input events. while (counter++ <= 100) { // Wait for the events. if (! ReadConsoleInput( hStdin, // input buffer handle irInBuf, // buffer to read into 128, // size of read buffer &cNumRead) ) // number of records read ErrorExit("ReadConsoleInput"); // Dispatch the events to the appropriate handler. for (i = 0; i < cNumRead; i++) { switch(irInBuf[i].EventType) { case KEY_EVENT: // keyboard input KeyEventProc(irInBuf[i].Event.KeyEvent); break; case MOUSE_EVENT: // mouse input MouseEventProc(irInBuf[i].Event.MouseEvent); break; case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing ResizeEventProc( irInBuf[i].Event.WindowBufferSizeEvent); break; case FOCUS_EVENT: // disregard focus events case MENU_EVENT: // disregard menu events break; default: ErrorExit("Unknown event type"); break; } } } return 0; }VOID ErrorExit (LPSTR lpszMessage) { fprintf(stderr, "%s\n", lpszMessage); ExitProcess(0); }VOID KeyEventProc(KEY_EVENT_RECORD ker){ printf("Key event: "); if(ker.bKeyDown) printf("key pressed\n"); else printf("key released\n");}VOID MouseEventProc(MOUSE_EVENT_RECORD mer){#ifndef MOUSE_HWHEELED#define MOUSE_HWHEELED 0x0008#endif printf("Mouse event: "); switch(mer.dwEventFlags) { case 0: printf("button press\n"); break; case DOUBLE_CLICK: printf("double click\n"); break; case MOUSE_HWHEELED: printf("horizontal mouse wheel\n"); break; case MOUSE_MOVED: printf("mouse moved\n"); break; case MOUSE_WHEELED: printf("vertical mouse wheel\n"); break; default: printf("unknown\n"); break; }}VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr){ printf("Resize event\n");}
我就花点事件给你解释下
WINDOW_BUFFER_SIZE_EVENT 屏幕大小改变时发出
MENU_EVENT 用户使用控制台菜单或工具栏时发出
FOCUS_EVENT 控制台得到输入焦点时发出
这是内部实现,当然我们外部也可以获得。利用管道,然后GetStdHandle(STD_INPUT_HANDLE);
然后即可读取Console窗口的事件。
好久没见到这么值得我回,详细解释的帖子。希望对后面看帖的朋友有帮助
用钩子实现
//该定义用于启动钩子的结构体
#define _WIN32_WINNT 0x0400
- 控制台程序接收键盘消息
- 控制台程序接收键盘消息
- 键盘钩子控制台程序
- 控制台屏蔽键盘消息事件
- PS键盘信号接收程序
- 网页DIV接收键盘按键消息解决办法
- 控制台获取键盘事件--SetConsoleCtrlHandler 处理控制台消息
- 捕获控制台程序的消息
- 利用短信猫接收短信控制台程序
- Qt输出到控制台/接收程序输出
- 控制台程序中实现消息传递
- C++控制台程序弹出消息框
- 让 基于 CWnd 类能接收键盘消息
- Winform跨程序发送、接收消息
- C语言控制台程序输入字符接收处理
- Android 程序键盘消息处理机制
- c语言:编写一个程序,可以直接接收键盘字符
- 消息接收
- 再分发 Windows Media 组件
- js校验大全
- 用纯C语言解决迷宫问题,简洁易懂
- 操作系统是什么?+读操作系统概念第六版
- Unix/Linux线程同步互斥量的使用
- 控制台程序接收键盘消息
- 编写Linux网络设备驱动(上)
- premiere导出时出现黑边的解决办法
- Aptana 3的dojo API doc(更新)
- hdu1042
- 防止设备重启后,数据丢失的办法
- 运算符优先级
- java中如何把源文件的内容复制到目标文件
- 讨论,您如何阅读论文?