Board logo

标题: [特效代码] 我也发个批处理贪吃蛇玩玩 [打印本页]

作者: lltlo    时间: 2022-8-11 20:05     标题: 我也发个批处理贪吃蛇玩玩

界面比较简陋,不太想优化了,主要是验证下批处理下的按键检测、光标定位、控制、Sleep等功能。
本来想再做个人机对战五子棋的,现在没啥闲工夫,等空了再说。
发贴有限制,脚本分两部分发,直接复制合并到一起就行。
上下左右方向键控制方向:
  1. :batch_start
  2. @echo off
  3. setlocal
  4. setlocal ENABLEDELAYEDEXPANSION
  5. rem 必须执行的步骤,初始化c#辅助程序
  6. call :init_cursor_control
  7. rem 脚本加在下面位置,其他地方不要动
  8. ::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  9. :game_start
  10. for /F %%a in ('echo prompt $E^| cmd') do set "_ESC=%%a"
  11. set Wall_Max_X=50
  12. set Wall_Max_Y=30
  13. set /a Wall_Position_Max_X=%Wall_Max_X% - 1
  14. set /a Wall_Position_Max_Y=%Wall_Max_Y% - 1
  15. set "Char_BlankSpace= "
  16. set "Char_Return=&echo;"
  17. rem 0最快,数字越大越慢,设置为9时1秒一步,依次累推
  18. set Snake_Move_Speed=0
  19. set Enable_Write_Debug_log=1
  20. set "Char_Wall=#"
  21. set "Wall_Str="
  22. set "Snake_Body=O"
  23. set "Snake_Head=*"
  24. set "Snake_Tail=."
  25. set "Snake_Init_Len=10"
  26. set "Snake_Str="
  27. set "Snake_Direction=up"
  28. set "Snake_Head_X=0"
  29. set "Snake_Head_Y=0"
  30. set "Char_Food=F"
  31. set "Food_X=0"
  32. set "Food_Y=0"
  33. set /a Snake_Move_Sleep_Time=%Snake_Move_Speed%*100
  34. call :set_cursor_visiable 0
  35. set /a WindowLines=%Wall_Max_Y% + 1
  36. mode con: cols=%Wall_Max_X% lines=%WindowLines%
  37. for /l %%l in (1,1,%Wall_Max_Y%) do (
  38.   if %%l equ 1 (
  39.     for /l %%c in (1,1,%Wall_Max_X%) do set Wall_Str=!Wall_Str!!Char_Wall!
  40.   ) else if %%l equ %Wall_Max_Y% (
  41.     set Wall_Str=!Wall_Str!!Char_Return!
  42. for /l %%c in (1,1,%Wall_Max_X%) do set Wall_Str=!Wall_Str!!Char_Wall!
  43.   ) else (
  44.     set Wall_Str=!Wall_Str!!Char_Return!
  45.     set Wall_Str=!Wall_Str!!Char_Wall!
  46. set /a BlankCount=%Wall_Max_X% - 2
  47. for /l %%c in (1,1,!BlankCount!) do set Wall_Str=!Wall_Str!!Char_BlankSpace!
  48. set Wall_Str=!Wall_Str!!Char_Wall!
  49.   )
  50. )
  51. echo %Wall_Str%
  52. set /a Snake_Init_X = (%Wall_Max_X% - 2) / 2
  53. set /a Snake_Init_Y = (%Wall_Max_Y% - 2 - %Snake_Init_Len%) / 2
  54. set /a Snake_End_Y = %Snake_Init_Y% + %Snake_Init_Len% - 1
  55. set /a Snake_Head_X = %Snake_Init_X%
  56. set /a Snake_Head_Y = %Snake_Init_Y%
  57. for /l %%l in (!Snake_Init_Y!,1,!Snake_End_Y!) do (
  58.   call :set_cursor_position !Snake_Init_X! %%l
  59.   if %%l equ !Snake_Init_Y! (
  60.     echo !Snake_Head!
  61.   ) else if %%l equ !Snake_End_Y! (
  62.     echo !Snake_Tail!
  63.   ) else (
  64.     echo !Snake_Body!
  65.   )
  66.   call :add_position_to_snake_str_tail !Snake_Init_X! %%l
  67. )
  68. call :random_gen_food
  69. :snake_loop
  70. call :sleep_until_key_press %Snake_Move_Sleep_Time% pressed_key
  71. if "%pressed_key%" equ "UpArrow" (if "%Snake_Direction%" neq "down" set Snake_Direction=up)
  72. if "%pressed_key%" equ "DownArrow" (if "%Snake_Direction%" neq "up" set Snake_Direction=down)
  73. if "%pressed_key%" equ "LeftArrow" (if "%Snake_Direction%" neq "right" set Snake_Direction=left)
  74. if "%pressed_key%" equ "RightArrow" (if "%Snake_Direction%" neq "left" set Snake_Direction=right)
  75. set /a snake_last_head_x = %Snake_Head_X%
  76. set /a snake_last_head_y = %Snake_Head_Y%
  77. if "%Snake_Direction%" equ "up" set /a Snake_Head_Y = %Snake_Head_Y% - 1
  78. if "%Snake_Direction%" equ "down" set /a Snake_Head_Y = %Snake_Head_Y% + 1
  79. if "%Snake_Direction%" equ "left" set /a Snake_Head_X = %Snake_Head_X% - 1
  80. if "%Snake_Direction%" equ "right" set /a Snake_Head_X = %Snake_Head_X% + 1
  81. call :get_snake_tail_position snake_tail_x snake_tail_y
  82. call :check_position_in_snake %Snake_Head_X% %Snake_Head_Y% in_snake
  83. if %snake_tail_x% equ %Snake_Head_X% (
  84.   if %snake_tail_y% equ %Snake_Head_Y% (
  85. set in_snake=0
  86.   )
  87. )
  88. if %in_snake% equ 1 (
  89.   call :show_game_over
  90.   pause >nul
  91.   goto :game_start
  92. )
  93. set snake_in_wall=0
  94. if %Snake_Head_X% equ 0 set snake_in_wall=1
  95. if %Snake_Head_X% equ %Wall_Position_Max_X% set snake_in_wall=1
  96. if %Snake_Head_Y% equ 0 set snake_in_wall=1
  97. if %Snake_Head_Y% equ %Wall_Position_Max_Y% set snake_in_wall=1
  98. if %snake_in_wall% equ 1 (
  99.   call :show_game_over
  100.   pause >nul
  101.   goto :game_start
  102. )
  103. set /a food_in_snake=0
  104. if %Snake_Head_X% equ %Food_X% (
  105.   if %Snake_Head_Y% equ %Food_Y% (
  106.     set /a food_in_snake=1
  107.   )
  108. )
  109. if %food_in_snake% equ 0 (
  110.   call :snake_tail_ahead
  111. )
  112. call :set_cursor_position %snake_last_head_x% %snake_last_head_y% & echo %Snake_Body%
  113. call :set_cursor_position %Snake_Head_X% %Snake_Head_Y% & echo %Snake_Head%
  114. ::call :write_log before add Snake_Str=%Snake_Str%
  115. call :add_position_to_snake_str_head %Snake_Head_X% %Snake_Head_Y%
  116. ::call :write_log after add Snake_Str=%Snake_Str%
  117. if %food_in_snake% equ 1 (
  118.   call :random_gen_food
  119. )
  120. goto :snake_loop
  121. :show_game_over
  122. set /a x = (%Wall_Max_X% - 2 - 5) / 2
  123. set /a y = (%Wall_Max_Y% - 2) / 2
  124. call :set_cursor_position %x% %y%
  125. echo Game Over   
  126. goto :eof
  127. :snake_tail_ahead
  128. call :get_snake_tail_position snake_tail_x snake_tail_y
  129. call :set_cursor_position %snake_tail_x% %snake_tail_y% & echo.%Char_BlankSpace%
  130. ::call :write_log before del Snake_Str=%Snake_Str%
  131. call :del_position_from_snake_str %snake_tail_x% %snake_tail_y%
  132. ::call :write_log after del Snake_Str=%Snake_Str%
  133. call :get_snake_tail_position snake_tail_x snake_tail_y
  134. call :set_cursor_position %snake_tail_x% %snake_tail_y% & echo.%Snake_Tail%
  135. goto :eof
  136. :random_gen_food
  137. set /a Food_X = 1 + (%RANDOM% %% (%Wall_Max_X% - 2))
  138. set /a Food_Y = 1 + (%RANDOM% %% (%Wall_Max_Y% - 2))
  139. call :check_position_in_snake %Food_X% %Food_Y% in_snake
  140. if %in_snake% equ 1 (goto :random_gen_food)
  141. call :set_cursor_position %Food_X% %Food_Y% & echo %Char_Food%
  142. goto :eof
  143. :sleep_until_key_press
  144. call :bat_helper_with_output sleeputilkeypress %~1
  145. for /f "tokens=1* delims=,;" %%a in ("%bat_helper_output%") do (
  146.   set %~2=%%a
  147. )
  148. goto :eof
  149. :check_position_in_snake
  150. call :get_position_string %~1 %~2 position_string
  151. echo %Snake_Str% | findstr /C:%position_string% >nul
  152. if %errorlevel% equ 0 (set %~3=1) else (set %~3=0)
  153. goto :eof
  154. :get_position_string
  155. set _x=%~1
  156. set _y=%~2
  157. if %_x% lss 10 (set _x=0%_x%)
  158. if %_y% lss 10 (set _y=0%_y%)
  159. set %~3=[%_x%,%_y%]
  160. goto :eof
  161. :get_position_from_string
  162. for /f "tokens=1,2 delims=,[]" %%a in ("%~1") do (
  163.   set x=%%a
  164.   set y=%%b
  165.   if "!x:~0,1!" equ "0" (set /a %~2=!x:~1,1!) else (set /a %~2=!x!)
  166.   if "!y:~0,1!" equ "0" (set /a %~3=!y:~1,1!) else (set /a %~3=!y!)
  167. )
  168. goto :eof
  169. :get_snake_tail_position
  170. set snake_tail_position_str=%Snake_Str:~-7%
  171. call :get_position_from_string "%snake_tail_position_str%" %~1 %~2
  172. goto :eof
  173. :add_position_to_snake_str_head
  174. call :get_position_string %~1 %~2 position_string
  175. set Snake_Str=!position_string!!Snake_Str!
  176. goto :eof
  177. :add_position_to_snake_str_tail
  178. call :get_position_string %~1 %~2 position_string
  179. set Snake_Str=!Snake_Str!!position_string!
  180. goto :eof
  181. :del_position_from_snake_str
  182. call :get_position_string %~1 %~2 position_string
  183. set Snake_Str=!Snake_Str:%position_string%=!
  184. goto :eof
  185. :write_log
  186. if %Enable_Write_Debug_log% equ 0 goto :eof
  187. echo %date% %time% %* >> debug.log
  188. goto :eof
  189. rem 脚本加在上面位置,其他地方不要动
  190. ::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  191. rem 脚本最后退出位置,下面的代码不要更改
  192. :batch_end
  193. endlocal
  194. exit /b %errorlevel%
  195. rem 获取毫秒时间戳
  196. :gettimestamp
  197. call :bat_helper_with_output gettimestamp
  198. for /f "tokens=1 delims=" %%a in ("%bat_helper_output%") do (set %~1=%%a)
  199. goto :eof
  200. rem 获取光标是否可见
  201. :get_cursor_visiable
  202. call :bat_helper getcursorvisiable
  203. set /a return_code=%errorlevel%
  204. ::echo getcursorvisiable return_code=%errorlevel%
  205. if %return_code%==0 set /a %~1=0
  206. if %return_code%==1 set /a %~1=1
  207. goto :eof
  208. rem 设置光标是否可见
  209. :set_cursor_visiable
  210. call :bat_helper setcursorvisiable %~1
  211. ::echo setcursorvisiable return_code=%errorlevel%
  212. goto :eof
  213. rem 获取backspace回退键
  214. :get_back_space
  215. for /F %%a in ('"prompt $h & for %%b in (1) do rem"')do set "%~1=%%a"
  216. goto :eof
  217. rem 设置光标位置
  218. :set_cursor_position
  219. set /a x=%~2 + 1
  220. set /a y=%~1 + 1
  221. <nul set /p "=%_ESC%[!x!;!y!H"
  222. ::call :bat_helper setcursorposition %~1 %~2
  223. goto :eof
  224. rem 获取当前窗口光标位置以及窗口尺寸
  225. :get_cursor_info
  226. call :bat_helper_with_output getcursorposition
  227. for /f "tokens=1,2,3,4 delims=,;" %%a in ("%bat_helper_output%") do (set %~1=%%a & set %~2=%%b & set %~3=%%c & set %~4=%%d)
  228. goto :eof
  229. rem 调用helper程序,并且将helper程序输出保存到bat_helper_output,返回值保存到bat_helper_errorlevel
  230. :bat_helper_with_output
  231. set bat_helper_output= <nul
  232. for /f "delims=" %%i in ('%bat_helper_exe_file_path% %*') do (set bat_helper_errorlevel=%errorlevel% & set bat_helper_output=%%i & goto :eof)
  233. set bat_helper_errorlevel=%errorlevel%
  234. goto :eof
  235. rem 调用helper程序,helper程序输出直接到终端,返回值保存到bat_helper_errorlevel
  236. :bat_helper
  237. %bat_helper_exe_file_path% %*
  238. set bat_helper_errorlevel=%errorlevel%
  239. goto :eof
  240. rem 初始化c#辅助程序,如果未找到就进行编译
  241. :init_cursor_control
  242. :: find csc.exe
  243. set "csc="
  244. for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*csc.exe") do  set "csc=%%#"
  245. if not exist "%csc%" (
  246.    echo no .net framework installed
  247.    exit /b 10
  248. )
  249. set bat_helper_exe_file_path="%tmp%\bat_helper.exe"
  250. if not exist "%bat_helper_exe_file_path%" (
  251.    call :gen_helper_csharp_source
  252.    call %csc% /nologo /warn:0 /out:%bat_helper_exe_file_path% "%tmp%\bat_helper.cs" || (
  253.       exit /b %errorlevel%
  254.    )
  255. )
  256. goto :eof
  257. rem 从此脚本中获取c#源码
  258. :gen_helper_csharp_source
  259. for /f "tokens=1,2 delims=: " %%n in ('findstr /N /C:"helper_csharp_start" "%~dpsfnx0"') do (
  260.    ::echo %%n "%%o"
  261.    if "%%o"=="helper_csharp_start" (
  262.       set /a helper_csharp_start_line=%%n+1
  263.       ::echo helper_csharp_start_line=!helper_csharp_start_line!
  264.       more +!helper_csharp_start_line! "%~dpsfnx0" > "%tmp%\bat_helper.cs"
  265.       goto :eof
  266.    )
  267. )
  268. goto :eof
复制代码

作者: lltlo    时间: 2022-8-11 20:06

第二部分,接到1楼后面就行。
  1. rem c#辅助程序开始位置
  2. :helper_csharp_start  
  3. using System;
  4. using System.Runtime.InteropServices;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Text;
  8. namespace bat_helper
  9. {
  10.     class Program
  11.     {
  12.         [DllImport("kernel32.dll", SetLastError = true)]
  13.         static extern IntPtr GetStdHandle(int nStdHandle);
  14.         [DllImport("kernel32.dll", SetLastError = true)]
  15.         static extern bool SetStdHandle(
  16.             uint nStdHandle,
  17.             IntPtr hHandle
  18.             );
  19.         [DllImport("kernel32.dll", SetLastError = true)]
  20.         internal static extern bool SetConsoleCursorPosition(
  21.             IntPtr hConsoleOutput,
  22.             COORD dwCursorPosition);
  23.         [DllImport("kernel32.dll", SetLastError = true)]
  24.         static extern bool GetConsoleScreenBufferInfo(
  25.             IntPtr hConsoleOutput,
  26.             ref CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo);
  27.         [DllImport("kernel32.dll", SetLastError = true)]
  28.         static extern uint GetLastError();
  29.         [DllImport("kernel32.dll", SetLastError = true)]
  30.         static extern bool GetConsoleCursorInfo(
  31.             IntPtr hConsoleOutput,
  32.             out CONSOLE_CURSOR_INFO lpConsoleCursorInfo
  33.             );
  34.         [DllImport("kernel32.dll", SetLastError = true)]
  35.         static extern bool SetConsoleCursorInfo(
  36.             IntPtr hConsoleOutput,
  37.             [In] ref CONSOLE_CURSOR_INFO lpConsoleCursorInfo
  38.             );
  39.         [DllImport("kernel32.dll", SetLastError = true)]
  40.         static extern bool AttachConsole(
  41.             uint dwProcessId
  42.             );
  43.         [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
  44.         static extern bool FreeConsole();
  45.         public struct CONSOLE_CURSOR_INFO
  46.         {
  47.             public uint dwSize;
  48.             public bool bVisible;
  49.         }
  50.         public struct COORD
  51.         {
  52.             public short X;
  53.             public short Y;
  54.         };
  55.         public struct SMALL_RECT
  56.         {
  57.             public ushort Left;
  58.             public ushort Top;
  59.             public ushort Right;
  60.             public ushort Bottom;
  61.         };
  62.         public struct CONSOLE_SCREEN_BUFFER_INFO
  63.         {
  64.             public COORD dwSize;
  65.             public COORD dwCursorPosition;
  66.             public ushort wAttributes;
  67.             public SMALL_RECT srWindow;
  68.             public COORD dwMaximumWindowSize;
  69.         };
  70.         const int STD_INPUT_HANDLE = -10;
  71.         const int STD_OUTPUT_HANDLE = -11;
  72.         const int STD_ERROR_HANDLE = -12;
  73.         const uint STD_OUTPUT_HANDLE_uint = 0xFFFFFFF5;
  74.         const uint ATTACH_PARENT_PROCESS = 0xffffffff;
  75.         static public IntPtr m_pOriginalStdOutputHandle = IntPtr.Zero;
  76.         static public void WriteLine(string strText)
  77.         {
  78.             // 先恢复成程序启动时的标准输出句柄,然后输出,再恢复后调用WriteLine时的标准输出句柄
  79.             IntPtr pOriginalStdOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  80.             SetStdHandle(STD_OUTPUT_HANDLE_uint, m_pOriginalStdOutputHandle);
  81.             Console.WriteLine(strText);
  82.             SetStdHandle(STD_OUTPUT_HANDLE_uint, pOriginalStdOutputHandle);
  83.             return;
  84.         }
  85.         static int Main(string[] args)
  86.         {
  87.             try
  88.             {
  89.                 // 先保存标准输出句柄,父进程重定向调用时,此句柄可能不是控制台,可能是文件或者其他什么句柄
  90.                 m_pOriginalStdOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  91.                 // 附加到父进程的Console,确保父进程重定向调用时,此程序也能获取到标准控制台输出
  92.                 FreeConsole();
  93.                 AttachConsole(ATTACH_PARENT_PROCESS);
  94.                 if (0 == args.Length)
  95.                 {
  96.                     return 87; // ERROR_INVALID_PARAMETER
  97.                 }
  98.                 if (args[0].ToLower() == "sleeputilkeypress")
  99.                 {
  100.                     if (args.Length < 2)
  101.                     {
  102.                         return 87; // ERROR_INVALID_PARAMETER
  103.                     }
  104.                     int iSleepTimeInMs = int.Parse(args[1]);
  105.                     long lStartTimeInMs = System.DateTime.Now.Ticks / 10000;
  106.                     while (true)
  107.                     {
  108.                         if (Console.KeyAvailable)
  109.                         {
  110.                             ConsoleKeyInfo key = Console.ReadKey(true);
  111.                             WriteLine(Convert.ToString(key.Key) + ";" + Convert.ToString(key.Modifiers));
  112.                             break;
  113.                         }
  114.                         long lCurrentTimeInMs = System.DateTime.Now.Ticks / 10000;
  115.                         long lDiffTimeInMs = lCurrentTimeInMs - lStartTimeInMs;
  116.                         if (lDiffTimeInMs >= iSleepTimeInMs)
  117.                         {
  118.                             break;
  119.                         }
  120.                         long lNeedSleepTime = iSleepTimeInMs - lDiffTimeInMs;
  121.                         if (lNeedSleepTime > 5)
  122.                         {
  123.                             lNeedSleepTime = 5;
  124.                         }
  125.                         System.Threading.Thread.Sleep(5);
  126.                     }
  127.                     return 0;
  128.                 }
  129.                 else if (args[0].ToLower() == "sleep")
  130.                 {
  131.                     if (args.Length < 2)
  132.                     {
  133.                         return 87; // ERROR_INVALID_PARAMETER
  134.                     }
  135.                     int iSleepTimeInMs = int.Parse(args[1]);
  136.                     System.Threading.Thread.Sleep(iSleepTimeInMs);
  137.                     return 0;
  138.                 }
  139.                 else if (args[0].ToLower() == "getcurrentdatetime")
  140.                 {
  141.                     WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff"));
  142.                     return 0;
  143.                 }
  144.                 else if (args[0].ToLower() == "getcursorposition")
  145.                 {
  146.                     IntPtr iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  147.                     CONSOLE_SCREEN_BUFFER_INFO oCONSOLE_SCREEN_BUFFER_INFO = new CONSOLE_SCREEN_BUFFER_INFO();
  148.                     bool bRes = GetConsoleScreenBufferInfo(iStdOut, ref oCONSOLE_SCREEN_BUFFER_INFO);
  149.                     if (!bRes)
  150.                     {
  151.                         uint uiLastErrorCode = GetLastError();
  152.                         return (int)uiLastErrorCode;
  153.                     }
  154.                     WriteLine(Convert.ToString(oCONSOLE_SCREEN_BUFFER_INFO.dwCursorPosition.X)
  155.                         + "," + Convert.ToString(oCONSOLE_SCREEN_BUFFER_INFO.dwCursorPosition.Y)
  156.                         + ";" + Convert.ToString(oCONSOLE_SCREEN_BUFFER_INFO.dwMaximumWindowSize.X)
  157.                         + "," + Convert.ToString(oCONSOLE_SCREEN_BUFFER_INFO.dwMaximumWindowSize.Y));
  158.                     return 0;
  159.                 }
  160.                 else if (args[0].ToLower() == "setcursorposition")
  161.                 {
  162.                     if (args.Length < 3)
  163.                     {
  164.                         return 87; // ERROR_INVALID_PARAMETER
  165.                     }
  166.                     COORD oCursorPosition;
  167.                     oCursorPosition.X = short.Parse(args[1]);
  168.                     oCursorPosition.Y = short.Parse(args[2]);
  169.                     IntPtr iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  170.                     bool bRes = SetConsoleCursorPosition(iStdOut, oCursorPosition);
  171.                     if (!bRes)
  172.                     {
  173.                         uint uiLastErrorCode = GetLastError();
  174.                         return (int)uiLastErrorCode;
  175.                     }
  176.                     return 0;
  177.                 }
  178.                 else if (args[0].ToLower() == "getcursorvisiable")
  179.                 {
  180.                     CONSOLE_CURSOR_INFO oCONSOLE_CURSOR_INFO = new CONSOLE_CURSOR_INFO();
  181.                     IntPtr iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  182.                     bool bRes = GetConsoleCursorInfo(iStdOut, out oCONSOLE_CURSOR_INFO);
  183.                     if (!bRes)
  184.                     {
  185.                         uint uiLastErrorCode = GetLastError();
  186.                         return ((int)uiLastErrorCode + 100); // 返回值大于100,肯定就是失败
  187.                     }
  188.                     return (oCONSOLE_CURSOR_INFO.bVisible ? 1 : 0);
  189.                 }
  190.                 else if (args[0].ToLower() == "setcursorvisiable")
  191.                 {
  192.                     if (args.Length < 2)
  193.                     {
  194.                         return 87; // ERROR_INVALID_PARAMETER
  195.                     }
  196.                     CONSOLE_CURSOR_INFO oCONSOLE_CURSOR_INFO = new CONSOLE_CURSOR_INFO();
  197.                     IntPtr iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  198.                     bool bRes = GetConsoleCursorInfo(iStdOut, out oCONSOLE_CURSOR_INFO);
  199.                     if (!bRes)
  200.                     {
  201.                         uint uiLastErrorCode = GetLastError();
  202.                         return (int)uiLastErrorCode;
  203.                     }
  204.                     oCONSOLE_CURSOR_INFO.bVisible = (0 == short.Parse(args[1]) ? false : true);
  205.                     bRes = SetConsoleCursorInfo(iStdOut, ref oCONSOLE_CURSOR_INFO);
  206.                     if (!bRes)
  207.                     {
  208.                         uint uiLastErrorCode = GetLastError();
  209.                         return (int)uiLastErrorCode;
  210.                     }
  211.                     return 0;
  212.                 }
  213.                 return 87; // ERROR_INVALID_PARAMETER
  214.             }
  215.             catch (Exception ex)
  216.             {
  217.                 WriteLine("exception: " + ex.ToString());
  218.                 return 87; // ERROR_INVALID_PARAMETER
  219.             }
  220.         }
  221.     }
  222. }
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2