我在整整一天的努力中,终于解决了 Windows 10 命令提示符这个令人非常沮丧的问题。这个问题让我以为我的控制台应用程序代码有问题。希望这篇文章能够帮助到其他人。
问题:我的控制台应用程序似乎会随机停止运行。发生了什么?
问题:我的控制台应用程序似乎会随机停止运行。发生了什么?
@echo off
...
java.exe -jar mytool.jar
java.exe -jar mytool.jar > log.txt
通过导入Windows的Kernel32.dll
库并使用控制台API函数GetStdHandle
,GetConsoleMode
和SetConsoleMode
,可以以编程方式禁用令人讨厌的QuickEdit模式。
ctypes
:简短(除了EXTENDED_FLAGS之外,禁用所有内容)。阅读SetConsoleMode
文档以获取更多详细信息。
import ctypes
kernel32 = ctypes.windll.kernel32
kernel32.SetConsoleMode(kernel32.GetStdHandle(-10), 0x80)
更长(禁用QUICK_EDIT_MODE而不改变其他设置)
import ctypes
import time
import threading
# Constants
STD_INPUT_HANDLE = -10
# Enum for ConsoleModes
class ConsoleModes(ctypes.c_uint):
ENABLE_PROCESSED_INPUT = 0x1
ENABLE_LINE_INPUT = 0x2
ENABLE_ECHO_INPUT = 0x4
ENABLE_WINDOW_INPUT = 0x8
ENABLE_MOUSE_INPUT = 0x10
ENABLE_INSERT_MODE = 0x20
ENABLE_QUICK_EDIT_MODE = 0x40
ENABLE_EXTENDED_FLAGS = 0x80
ENABLE_AUTO_POSITION = 0x100
# Import kernel32.dll functions
kernel32 = ctypes.windll.kernel32
GetStdHandle = kernel32.GetStdHandle
GetConsoleMode = kernel32.GetConsoleMode
SetConsoleMode = kernel32.SetConsoleMode
def disable_quick_edit_mode():
std_in = GetStdHandle(STD_INPUT_HANDLE)
mode = ctypes.c_uint()
if GetConsoleMode(std_in, ctypes.byref(mode)):
if mode.value & ConsoleModes.ENABLE_QUICK_EDIT_MODE:
mode.value ^= ConsoleModes.ENABLE_QUICK_EDIT_MODE
SetConsoleMode(std_in, mode)
def print_numbers():
i = 0
while True:
time.sleep(0.3)
print(i)
i += 1
def main():
disable_quick_edit_mode()
threading.Thread(target=print_numbers).start()
if __name__ == "__main__":
main()