簡體   English   中英

從我的應用程序中關閉 Windows 10 控制台“標記”模式

[英]Turn off Windows 10 console "Mark" mode from my application

我有一個用 Python 編寫的控制台應用程序。 Windows 10 控制台的“標記”模式讓我非常沮喪,因為用戶在執行諸如切換窗口之類的簡單操作時不小心點擊了應用程序。 我有什么辦法來控制和阻止這種情況嗎?

對於那些不知道標記模式的人來說,這是當用戶在控制台窗口中選擇一些文本時。 當程序下一次寫入stdout時,整個程序就暫停了,很煩人。

在 Windows 10 中使用鼠標的自動“標記”模式是之前版本的“快速編輯”模式。 我相信唯一的區別是它現在默認開啟。 可以從代碼啟用/禁用快速編輯模式:

import time
import win32console

ENABLE_QUICK_EDIT_MODE = 0x40
ENABLE_EXTENDED_FLAGS = 0x80


def quick_edit_mode(turn_on=None):
    """ Enable/Disable windows console Quick Edit Mode """
    screen_buffer = win32console.GetStdHandle(-10)
    orig_mode = screen_buffer.GetConsoleMode()
    is_on = (orig_mode & ENABLE_QUICK_EDIT_MODE)
    if is_on != turn_on and turn_on is not None:
        if turn_on:
            new_mode = orig_mode | ENABLE_QUICK_EDIT_MODE
        else:
            new_mode = orig_mode & ~ENABLE_QUICK_EDIT_MODE
        screen_buffer.SetConsoleMode(new_mode | ENABLE_EXTENDED_FLAGS)

    return is_on if turn_on is None else turn_on

quick_edit_enabled = quick_edit_mode()
while True:
    print('Quick edit is %s' % ('on' if quick_edit_enabled else 'off'))
    time.sleep(3)
    quick_edit_enabled = quick_edit_mode(not quick_edit_enabled)

我對斯蒂芬的答案發表評論的聲譽有點不足,所以我發布了一個單獨的答案。

為了使這種多平台/環境友好,添加一些條件檢查以在未在 Windows 上運行或沒有控制台連接到進程時(例如在 IDE 中運行或通過 pyinstaller 構建時等)跳過代碼:

if os.name == "nt" and sys.stdout.isatty():
    # stephen's code here...

這可以防止在幾種情況下引發錯誤。 在我看來,您還應該在代碼塊周圍添加一個 try/catch-all,因為所涉及方法的操作系統實現是未知的,並且已知會引發異常並且很挑剔。 在最壞的情況下,我寧願我的代碼在啟用 QuickEdit 的情況下繼續運行,也不願因此而失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM