опубликован 30-03-2001 10:27 MSK
Господа, взгляните на ЭТО.Q> Как переключить консоль в полный экран и обратно?
A> (c)1999 Ashot Oganesyan K, SmartLine, Inc mailto:ashot@aha.ru
Когда Вы запускаете свое приложение в консольном окне Вы можете нажать ALT+ENTER для переключения консоли в полный экран.Но нет документированных функций,чтобы сделать это.Однако Windows9X посылает сообщение WM_COMMAND со специальным идентификатором,когда пользователь нажимает ALT+ENTER:
#define ID_SWITCH_CONSOLEMODE 0xE00F
Для переключения режимов Вы можете использовать ф-ию SendMessage:
SendMessage(hWnd,WM_COMMAND,ID_SWITCH_CONSOLEMODE,0);
Однако это не работает в Windows NT/2000.
Windows NT/2000 содержит две недокументированные функции,которые
позволяют нам добраться до консольного окна:
BOOL SetConsoleDisplayMode (
HANDLE hOut, // standard output handle
DWORD dwNewMode, // specifies the display mode
LPDWORD lpdwOldMode, // address of variable for previous value of display mode
);
BOOL GetConsoleDisplayMode (
LPDWORD lpdwMode, // address of variable for current value of display mode
);
Эти функции экспортируются Kernel32.dll, но Kernel32.lib их не содержит.
Поэтому мы вынуждены использовать функцию GetProcAddress:
typedef BOOL (WINAPI *PROCSETCONSOLEDISPLAYMODE)(HANDLE,DWORD,LPDWORD);
typedef BOOL (WINAPI *PROCGETCONSOLEDISPLAYMODE)(LPDWORD);
PROCSETCONSOLEDISPLAYMODE SetConsoleDisplayMode;
PROCGETCONSOLEDISPLAYMODE GetConsoleDisplayMode;
HMODULE hKernel32 = GetModuleHandle("kernel32");
SetConsoleDisplayMode = (PROCSETCONSOLEDISPLAYMODEELLWND)
GetProcAddress(hKernel32,"SetConsoleDisplayMode");
GetConsoleDisplayModeplayMode = (PROCGETCONSOLEDISPLAYMODE)
GetProcAddress(hKernel32,"GetConsoleDisplayMode");
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwOldMode;
SetConsoleDisplayMode(hOut,1,&dwOldMode);
---------------------------------------------
Теперь насчет реализации.
1) До запуска CreateProcess, с целью уменьшения геморроя, создаю батник с двумя символами (это твоя идея Flex Ferrum) "%1", потом ДИНАМИЧЕСКИ (с помощью апишной ShellLink, тоже неочевидно сразу, если нужен код, пишите), создаю ярлык к этому батнику, далее, есс-но запускаю уже досовский бат-файл (или экзешник, без разницы), передавая его в качестве параметра созданному pif-файлу.
2) Реально столкнулся к совершенно НЕОЧЕВИДНОЙ проблемой даже при реализации этого метода. Оказывается при динамическом создании ярлыка к досовскому объекту, мы не можем программно установить параметры этого ярлыка (закрывать окно после завершения работы, полноэранный режим и т.д.). В в MS хеадер-файле shlobj.h нашел НЕДОКУМЕНТИРОВАННЫЕ структуры в духе NT_CONSOLE_PROPS, которые по видимому являюся заготовками, т.к. нигде не используются (их наполнения в духе BOOL bFullScreen или QuickMode дают нам понять, что это и есть нам нужные свойства pif-файлов). Вот так.
Поэтому для изменения свойств pif-файла планирую просто править его байты программно.
3) 2 aldep. Идея с нитями не прошла. Thread есть, а окон, ему принадлежащих НЕТ!! Ноль на выходе EnumThreadWindows и все...