Консольное приложение Win32 может обнаружить, если оно было выполнено из проводника или нет?

А вот и ты. Это использует LocalStorage для хранения счетчика в качестве переменной и увеличивает его при каждом нажатии кнопки. LocalStorage может хранить только строки, поэтому для добавления 1 требуется сначала преобразование в int.

Я не могу встроить код непосредственно в этот ответ из-за ограничений SO. Вот код и работающий JSFiddle .

HTML:



Javascript:

  // This function increases the count
  function clickButtonFunction() {

  console.log('run');

  //Check to see if the localstorage variable exists. If it does not, this is the first time coming to the page, and we need to initalize it to 0
  if (localStorage.getItem("clickCounter") === null) {
    // Store
    localStorage.setItem("clickCounter", "0");
  }

  // Get the value from local storage
  var value = parseInt(localStorage.getItem("clickCounter"));

  // Incrememtnt the count by 1
  var newValue = value + 1

  //Write the value back to local storage
  localStorage.setItem("clickCounter", newValue);


  // Write the value to the div
  document.getElementById("clickCounter").innerHTML = newValue

}

// Reset local storage to 0
function clickReset() {

  localStorage.setItem("clickCounter", "0");
  // Write the value to the div
  document.getElementById("clickCounter").innerHTML = '0'


}

https://jsfiddle.net/tLyva5oq/

В будущем вы должны действительно включить в свой вопрос свои попытки решения проблемы.

35
задан Daniel Rikowski 23 March 2012 в 08:40
поделиться

4 ответа

См. http://support.microsoft.com/kb/99115 , "ИНФОРМАЦИЯ: Препятствование, чтобы Консоль Исчезла".

идея состоит в том, чтобы использовать GetConsoleScreenBufferInfo, чтобы решить, что курсор не переместился от начальных 0,0 положений.

Пример кода от @tomlogic, на основе Статьи базы знаний, на которую ссылаются:

// call in main() before printing to stdout
// returns TRUE if program is in its own console (cursor at 0,0) or
// FALSE if it was launched from an existing console.
// See http://support.microsoft.com/kb/99115
#include <stdio.h>
#include <windows.h>
int separate_console( void)
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;

    if (!GetConsoleScreenBufferInfo( GetStdHandle( STD_OUTPUT_HANDLE), &csbi))
    {
        printf( "GetConsoleScreenBufferInfo failed: %lu\n", GetLastError());
        return FALSE;
    }

    // if cursor position is (0,0) then we were launched in a separate console
    return ((!csbi.dwCursorPosition.X) && (!csbi.dwCursorPosition.Y));
}
29
ответ дан tomlogic 27 November 2019 в 15:41
поделиться

Я верю cmd.exe наборы CMDCMDLINE и CMDEXTVERSION environemntal переменные, когда он запускается. Таким образом, если они установлены, Ваша программа была по всей вероятности запущена от оболочки.

Это не является надежным, но это - что-то.

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

3
ответ дан Artelius 27 November 2019 в 15:41
поделиться

Как насчет того, чтобы ожидать нажатия клавиши, когда Вы отображаете сообщение об ошибке, и не другие времена?

0
ответ дан Martin Plante 27 November 2019 в 15:41
поделиться

GetConsoleTitle ()

Я видел код, который выполняет

if (!GetConsoleTitle(NULL, 0) && GetLastError() == ERROR_SUCCESS) {
    // Console
} else {
    // GUI
}

НО ... Я обнаружил, что AttachConsole () более полезен

На C ++ (вне моей головы, а я не программист на C ++)

if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
    // GUI
} else {
    // Console, and you have a handle to the console that already exists.
}

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

5
ответ дан 27 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: