Иконка и заголовок консоли

Тема в разделе "WASM.WIN32", создана пользователем mc black, 7 июн 2008.

  1. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Задачка нетривиальная, как может показаться на первый взгляд. Скажите, может кто знает, как можно получить в своём оконном приложении иконку и заголовок того ярлыка, через который было запущено приложение? Приведу пример, если не совсем понятно объяснил:

    Созадал .bat-файл, который делает резервную копию инф'ы, запускаю этот файл через ярлык, который лежит в quiklanch. У ярлыка настроена иконка, отличная от того, что имеем для ярлыка на bat-файл. При запуске и во время архивирования в заголовке консоли windows вижу эту иконку и название ярлыка.

    Так вот, мне понятно, что эта особенность специфична для консоли windows (если что, у меня XP SP2). Но вот как заставить вести себя подобным образом простое оконное приложение, создаваемое, скажем через регистрацию класса и CreateWindow/CreateWindowEx? Желательно решить эту задачу без промежуточного вызова консольного окошка для выковыривания иконки и текста заголовка самой консоли, хотя это и есть одно из возможных решений.
     
  2. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    http://delphiworld.narod.ru/base/change_console_win_icon_and_caption.html
    Советую скачать от туда всю базу статей.

    Если ты будешь работать с заголовком консольного окна, то при запуске в Ubuntu (или другом лине) под wine, появится это самое окошко, но вывод всё равно будет идти в терминальное окно. Вчера проверял.
     
  3. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Спасибо за пример, но к сожалению требовалось не это, а просто надо получить дескриптор иконки и указатель на строку ярлыка, по которому было вызвано приложение, причём я бы хотел, чтобы не создавалось никаких консолей, а создалось обыное оконное приложение, причём сразу. Я считаю, что раз консоль cmd.exe является простым оконным windows приложением, то она (консоль) как-то получает при запуске данные ярлыка, через который она была вызвана.
     
  4. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    mc black, не верно понял (заголовок темы напомнил о вчерашних стараниях).
    Тебе нужно достать иконку из lnk файла?
     
  5. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    иконка обычно сама присваивается.
    по крайней мере с pif файлами.
    иначе - апи. незнаю какие, но у винды нет невозможного.
    а там - SetConsoleTitle() из GetCommandLineA(),
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Было увидено, что по адресу [PEB.ProcessParameters] (==0x20000) находится структура RTL_USER_PROCESS_PARAMETERS.

    По смещению 0x70 (в висте32 и wnet32) в RTL_USER_PROCESS_PARAMETERS находится UNICODE_STRING, определяющая имя ярлыка, с которого запущен процесс. Ну а получение иконки, определённой в ярлыке, должно быть документировано.

    Итак,
    [PEB.ProcessParameters].WindowTilte.Buffer


    Edit:
    А-ха. Всё несколько проще: GetStartupInfo(STARTUPINFO* si).
    Похоже, что si.lpTitle получает указатель на строку с именем ярлыка.
     
  7. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Sol_Ksacap
    Спасибо, ты оказался прав! Я думал раньше про STARTUPINFO, но, к сожалению, поленился это проверять..