Вывод окна консоли из «режима выбора» для предотвращения сбоя - PullRequest
0 голосов
/ 09 февраля 2019

В моем приложении C # я пытаюсь предотвратить сбой в моем приложении, в основном я использую окно консоли в качестве окна отображения журнала.Я уже решил проблему «Кнопка закрытия», отключив окно закрытия, и я показываю / скрываю меню с помощью Показать и скрыть вызовы, все это работает очень хорошо.

Мой последний шаг - если Выбор текстаактивное и окно пытается скрыться.

Мне либо нужно:

A.Выбить окно из режима выбора.(не уверен, как бы я это сделал, так как выбор приостанавливает весь вывод.)

B.Отключить меню «Правка» таким же образом, как я отключил меню «Закрыть», в надежде, что оно также отключит выбор мыши, но мне еще не удалось найти способ удалить меню «Правка», и я даже не уверенэто помешало бы выделению мыши.

C.Это кажется наиболее очевидным, отключить выбор мыши, и это то, что у меня есть в моем коде, но он не работает, поэтому я не уверен, что мне не хватает.

Код в вопросе:

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 ....
[DllImport("Kernel32.dll", ExactSpelling = true)]
private static extern int SetConsoleMode(IntPtr hWnd, int wFlag);
 ....
public static void HideConsoleLog () {
    if (handle != IntPtr.Zero) {
        SetConsoleMode(handle, 0x0080);  // ENABLE_EXTENDED_FLAGS 0x0080
        ShowWindow(handle, (int)WinCntrlOpt.SW_HIDE);
        LogVisible = false;
    }
}

Согласно документации :

ENABLE_EXTENDED_FLAGS 0x0080 Требуется для включения или отключения расширенных флагов.См. ENABLE_INSERT_MODE и ENABLE_QUICK_EDIT_MODE.

И ...

ENABLE_QUICK_EDIT_MODE 0x0040 Этот флаг позволяет пользователю использовать мышь для выбора и редактирования текста.

Чтобы включить этот режим, используйте ENABLE_QUICK_EDIT_MODE |ENABLE_EXTENDED_FLAGS.Чтобы отключить этот режим, используйте ENABLE_EXTENDED_FLAGS без этого флага.

Итак, похоже, я делаю это правильно, и он работает, но не мешает выбору мыши.Я знаю, что не так давно Microsoft возилась с консолями , и я не знаю, сломалось ли это или нет.

Есть аналогичный вопрос на обмене стека, но это никоим образом не дает работающего решения и фактически является противоположностью того, что я пытаюсь сделать, и в C или C ++.Я могу интерполировать, но это в основном то, что я уже пробую здесь.

Кажется, это то же самое предложение, используйте ENABLE_EXTENDED_FLAGS без каких-либо других флагов, чтобы отключить эту опцию, и это то, что у меня есть.Но это не работает.

Итак, я либо исцарапываю неверное решение, либо неправильно что-то делаю.

В результате, когда окно консоли открыто, вы можетеиспользуйте мышь для выбора текста, который автоматически переводит консоль в тот «режим выбора», который добавила Microsoft.Это не проблема, но когда он остается в этом режиме, и вы выбираете «Показать журнал» (пункт меню с переключателем, отмеченный галочкой в ​​главном окне приложения), окно консоли действительно скрывается, но затем главное окно блокируется иприложение вылетает.(Я предполагаю, потому что окно заблокировано этим режимом выбора.) Он не падает, когда «режим выбора» не активен.

Я также хотел бы попробовать это из той же документации:

ENABLE_MOUSE_INPUT 0x0010 Если указатель мыши находится в границах окна консоли, а окно имеет фокус клавиатуры, мышьсобытия, генерируемые движением мыши и нажатиями кнопок, помещаются во входной буфер.Эти события отбрасываются ReadFile или ReadConsole, даже когда этот режим включен.

Проблема в том, что:

Когда создается консоль, все режимы ввода, кромеENABLE_WINDOW_INPUT включены по умолчанию.

Итак, как мне его отключить?

Я в порядке с любым решением, которое либо выводит его из режима выбора, либо запрещает начинать си у меня есть то, что я пытался.

1 Ответ

0 голосов
/ 12 февраля 2019

Когда выбрана опция меню «Показать журнал», окно будет свернуто.Прежде чем окно сворачивается, вы должны проверить, выбрал ли пользователь какой-либо вход, чтобы предотвратить сбой.Вы можете проверить, выбирает ли пользователь что-либо, используя GetConsoleSelectionInfo .

Параметр CONSOLE_SELECTION_INFO out должен быть равен 0x00, а если нет, вам нужно обработать выборку.Как видно из документации GetConsoleMode / SetConsoleMode , вам нужно либо вызвать ReadFile , либо ReadConsole , чтобы отменить событие выбора, которое может происходить

Когда вы это реализовали, он больше не должен падать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...