Доброго времени суток уважаемые.
Возникла пара вопросов:
1.
Если фокус находится в консоли, то Alt+F4 не работает и выйти из коммандера можно только мышой.
Значит, Alt+F4 ты получаешь. Надо только придумать как об этом сообщить ТС. Тупо слать WM_CLOSE нельзя, потому что, возможно, открыт модальный диалог
А если посылать тоталу 24340 ака cm_Exit?
2. Насчёт размеров шрифта, я начинаю ненавидеть Делфи - половина функций для работы с консолью вообще необьявлена...
Для получения размеров надо вызывать
Код: Выделить всё
GetConsoleFontSize(hConsoleOutput:THandle; nFont:Cardinal),
где nFont - индекс используемого шрифта получаемого
Код: Выделить всё
GetCurrentConsoleFont(hConsoleOutput:THandle;
bMaximumWindow:LongBool;
lpConsoleCurrentFont:PCONSOLE_FONT_INFO): LongBOOL stdcall;
Вторая функция работает и возвращает индекс (правильный), а вот GetConsoleFontSize возвращает ошибку "недопустимый дескриптор".
У меня уже кипит моск, помогите плиз.
Выдрал из МСДН-а структуры и обьявил фунцы:
Код: Выделить всё
type PCONSOLE_FONT_INFO=^TCONSOLE_FONT_INFO;
TCONSOLE_FONT_INFO=record
nFont:DWORD;
dwFontSize:COORD;
end;
TGetCurrentConsoleFont = function (hConsoleOutput:THandle;
bMaximumWindow:LongBool;
lpConsoleCurrentFont:PCONSOLE_FONT_INFO): LongBOOL stdcall;
TGetConsoleFontSize=function( hConsoleOutput:THandle;
nFont:Cardinal):COORD;
var
GetCurrentConsoleFont:TGetCurrentConsoleFont;
fsn:TCONSOLE_FONT_INFO;
GetConsoleFontSize:TGetConsoleFontSize;
Siz:COORD;
std:THandle;
Nf:DWORD;
begin
//подключаем фунцы
@GetCurrentConsoleFont := GetProcAddress( GetModuleHandle('kernel32.dll'), 'GetCurrentConsoleFont');
@GetConsoleFontSize := GetProcAddress( GetModuleHandle('kernel32.dll'), 'GetConsoleFontSize');
//проверяем
if not assigned(GetCurrentConsoleFont) then Messagebox(0,'Not assigned','Error',mb_Ok) ;
if not assigned(GetConsoleFontSize) then Messagebox(0,'Not assigned','Error',mb_Ok) ;
//получаем вых хэндл
std:=GetStdHandle(STD_OUTPUT_HANDLE);
if std=0 then ShowMessage('Error='+Inttostr(GetLastError)+#10+#13+SysErrorMessage(GetLastError));
//получаем индекс шрифта, возвращает правильный результат...
if Not GetCurrentConsoleFont(std,False,@fsn) then ShowMessage(SysErrorMessage(GetLastError));
//сохраняем полученые данные (размер окна)
siz:=fsn.dwFontSize;
//А вот эта фунца выдаёт нули что по МСДНу ошибочно
fsn.dwFontSize:=GetConsoleFontSize(GetStdHandle(STD_OUTPUT_HANDLE),(fsn.nFont));
//Если фунца не сработала (а она не работает), то месага последней ошибки
if (fsn.dwFontSize.X=0) and (fsn.dwFontSize.y=0) then ShowMessage('Error='+Inttostr(GetLastError)+#10+#13+SysErrorMessage(GetLastError));
//вывод полученых данных (и не полученых тоже)
ShowMessage('Fsn'+#10+#13+'x='+IntToStr(fsn.dwFontSize.X)+#10+#13+'Y='+IntToStr(fsn.dwFontSize.Y)+#10+#13+'Siz'+#10+#13+'x='+IntToStr(Siz.X)+#10+#13+'Y='+IntToStr(Siz.Y));
Кто скажет где ошибка? (Только не надо говорить что в ДНК

мой папа старался

)
Ещё могу сказать, что консоль у которой выдёргиваем данные приаттачена через AttachConsole.
Если код верен, но не рабоч :\ то другой вопрос: Как можно получить список терминальных шрифтов используемых консолью?
Гугля об этом несёт чушь...
Немного об изменениях:
некоторые хоткеи не работают, когда фокус в консоли, например Ctrl+Win+O (вместо нового таба, в консоль впечатывается последовательность ^O)
*Пошёл на изврат, сделал возможность хоткеить и через хук и через RegisterHotkey. Теперь можно избежать бяк типа ^O в консоли.
*Доработал изменения размеров (уже в который раз

). Особенно МАХ режим...
*Запуск\закрытие консолей колёсиком мыши.
*Изменение цвета заголовка при потере\получении фокуса.
*Добавил пару опций
*Уменьшил вероятность запуска пустого таба (без консольного окна), нехороший баг оказался...
Планирую для версии 0.4:
Доработать внутренние команды, добавить пару новых.
Пофиксить размер консоли при смене шрифта.
Сделать наконец полноценный перехват из командной строки.