zoukankan      html  css  js  c++  java
  • 使控制台窗口支持鼠标的程序

    tfref

    //mouse.c - 主程序文件
    #include <windows.h> #include <stdio.h> int main(int argc, char** argv) { DWORD dwMode, dwOldMode; /* 原来的模式与新模式 */ DWORD dwRead; /* 已经读取的输入事件数 */ int mouse_pos; /* 用于返回鼠标位置 */ UINT count; /* 用于循环控制 */ INPUT_RECORD ir[128]; /* 控制台输入记录 */ CONSOLE_CURSOR_INFO cci, cciOld; /* 鼠标相关的设置 */ COORD co; /* 鼠标移动时更新坐标 */ HANDLE hStdIn = NULL, hStdOut = NULL; /* 标准输入输出句柄 */ if(argc == 2 && argv[1][0] == '/' && argv[1][1] == '\?') { printf("控制台鼠标支持程序\n\n" "使用方法:\n" "\t/\?\t查看帮助\n\n" "返回值处理:\n" "\t%%ERRORLEVEL%% 高 16 位包含鼠标 X 坐标\n" "\t%%ERRORLEVEL%% 低 16 位包含鼠标 Y 坐标\n" "比如:返回 65537, 可以用如下方式取得 X,Y\n" "\tset /a ret=%%errorlevel%%\n" "\tset /a \"x=%%ret%%>>16\"\n" "\tset /a \"y=%%ret%%&65535\"\n\n" "女孩不哭,QQ:191035066 @ 批处理之家\n"); return 0; } hStdIn = GetStdHandle(STD_INPUT_HANDLE); /* 取得输入输出句柄 */ hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); if(!GetConsoleMode(hStdIn, &dwOldMode)) /* 取得控制台原来的模式 */ { fprintf(stderr, "GetConsoleMode 错误:%d\n", GetLastError()); goto _exit; } dwMode = dwOldMode | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; if(!SetConsoleMode(hStdIn, dwMode)) /* 开启鼠标事件 */ { fprintf(stderr, "SetConsoleMode 错误:%d\n", GetLastError()); goto _exit; } GetConsoleCursorInfo(hStdOut, &cciOld); cci.bVisible = TRUE; /* 可见 */ cci.dwSize = 100; /* 块状 */ if(!SetConsoleCursorInfo(hStdOut, &cci)) { fprintf(stderr, "SetConsoleCursorInfo 错误:%d\n", GetLastError()); goto _exit; } for(;;) /* 循环等待用户事件 */ { if(!ReadConsoleInput(hStdIn, &ir[0], 128, &dwRead)) { fprintf(stderr, "ReadConsoleInput 错误:%d\n", GetLastError()); goto _exit; } for(count=0; count<dwRead; count++) { switch(ir[count].EventType) { case MOUSE_EVENT: switch(ir[count].Event.MouseEvent.dwEventFlags) { case 0: /* 取得鼠标单击事件 */ if(ir[count].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) { SetConsoleMode(hStdIn, dwOldMode); /* 还原原来的设置 */ SetConsoleCursorInfo(hStdOut, &cciOld); mouse_pos = ir[count].Event.MouseEvent.dwMousePosition.X; mouse_pos = mouse_pos << 16 | ir[count].Event.MouseEvent.dwMousePosition.Y; return mouse_pos; } break; case MOUSE_MOVED: /* 更新鼠标位置 */ co.X = ir[count].Event.MouseEvent.dwMousePosition.X; co.Y = ir[count].Event.MouseEvent.dwMousePosition.Y; SetConsoleCursorPosition(hStdOut, co); break; } break; default: break; } } } _exit: return 1; }

    示例脚本程序:

    ::test_mouse.bat - 脚本程序
    @echo
    off :main mouse.exe set /a "ret=%errorlevel%,x=ret>>16,y=ret&65535" title 鼠标演示程序, 鼠标坐标=(%x%,%y%) goto :main

    源代码下载: http://alioss.twofei.com/windows/mouse.7z
    女孩不哭(QQ:191035066)@2012-06-08 23:32:53 @ http://www.cnblogs.com/nbsofer

    发表于:http://bbs.bathome.net/thread-17292-1-1.html

  • 相关阅读:
    归并之将两个有序数组合并(已測试)
    Embedded Android 协同翻译
    IOS中公布应用程序,进度条一直不走怎么处理
    《textanalytics》课程简单总结(2):topic mining
    编程小错误备忘录
    观察者模式
    scrapy递归抓取网页数据
    leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法
    spring4.0.0的配置和使用
    ios面试基础
  • 原文地址:https://www.cnblogs.com/memset/p/2542546.html
Copyright © 2011-2022 走看看