|
- diff --git a/source/bases/Win32GUI.c b/source/bases/Win32GUI.c
- index 490cdd3..f350d5f 100644
- --- a/source/bases/Win32GUI.c
- +++ b/source/bases/Win32GUI.c
- @@ -220,26 +220,85 @@ static int FatalScriptError()
- #include "Common.c"
-
-
- +/* the code below is based on https://www.tillett.info/2013/05/13/how-to-create-a-windows-program-that-works-as-both-as-a-gui-and-console-application/
- + */
- +
- +static BOOL has_console = FALSE;
- +
- +// Attach output of application to parent console
- +static BOOL attachOutputToConsole(void)
- +{
- + HANDLE consoleHandleOut, consoleHandleError;
- +
- + if (AttachConsole(ATTACH_PARENT_PROCESS))
- + {
- + // Redirect unbuffered STDOUT to the console
- + consoleHandleOut = GetStdHandle(STD_OUTPUT_HANDLE);
- + if (consoleHandleOut != INVALID_HANDLE_VALUE)
- + {
- + freopen("CONOUT$", "w", stdout);
- + setvbuf(stdout, NULL, _IONBF, 0);
- + }
- +
- + // Redirect unbuffered STDERR to the console
- + consoleHandleError = GetStdHandle(STD_ERROR_HANDLE);
- + if (consoleHandleError != INVALID_HANDLE_VALUE)
- + {
- + freopen("CONOUT$", "w", stderr);
- + setvbuf(stderr, NULL, _IONBF, 0);
- + }
- +
- + return TRUE;
- + }
- +
- + //Not a console application
- + return FALSE;
- +}
- +
- +static void closeConsole()
- +{
- + // Send "enter" to release application from the console
- + // This is a hack, but if not used the console doesn't know the application has
- + // returned. The "enter" key only sent if the console window is in focus.
- + if (has_console && (GetConsoleWindow() == GetForegroundWindow() || SetFocus(GetConsoleWindow()) != NULL))
- + {
- + INPUT ip;
- + // Set up a generic keyboard event.
- + ip.type = INPUT_KEYBOARD;
- + ip.ki.wScan = 0; // hardware scan code for key
- + ip.ki.time = 0;
- + ip.ki.dwExtraInfo = 0;
- +
- + // Send the "Enter" key
- + ip.ki.wVk = 0x0D; // virtual-key code for the "Enter" key
- + ip.ki.dwFlags = 0; // 0 for key press
- + SendInput(1, &ip, sizeof(INPUT));
- +
- + // Release the "Enter" key
- + ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
- + SendInput(1, &ip, sizeof(INPUT));
- + }
- +}
- +
- //-----------------------------------------------------------------------------
- // WinMain()
- // Main routine for the executable in Windows.
- //-----------------------------------------------------------------------------
- -int WINAPI wWinMain(
- - HINSTANCE instance, // handle to application
- - HINSTANCE prevInstance, // previous handle to application
- - wchar_t *commandLine, // command line
- - int showFlag) // show flag
- +int wmain(int argc, wchar_t **argv)
- {
- + has_console = attachOutputToConsole();
- + atexit(closeConsole);
- int status = 0;
-
- // initialize Python
- - if (InitializePython(__argc, __wargv) < 0)
- + if (InitializePython(argc, argv) < 0)
- status = 1;
-
- // do the work
- if (status == 0 && ExecuteScript() < 0)
- status = 1;
- Py_Finalize();
- +
- return status;
- }
-
|