Скрытие окон при создании процесса

Тема в разделе "WASM.WIN32", создана пользователем Rel, 9 дек 2009.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Доброго времени суток. Подскажите пожалуйста, мне необходимо создать процессы (несколько разных в разное время) со скрытыми окнами, то есть чтобы наличие процесса не отразилось на экране, таксбаре и по альттабу. Большего сокрытия не требуется. Я пробывал сделать так:
    Код (Text):
    1.  
    2. STARTUPINFO si;
    3. si.cb = sizeof(STARTUPINFO);
    4. si.wShowWindow = 0;
    5. si.dwFlags = STARTF_USESHOWWINDOW;
    С какими то процессами работает нормально, а некоторые процессы игнорируют параметры запуска и создают окна по своему усмотрению. Пробывал делать так:
    Код (Text):
    1. BOOL CALLBACK HideThreadWndProc(HWND hWnd, LPARAM lParam)
    2. {
    3.     ShowWindow(hWnd, 0);
    4.     return TRUE;
    5. }
    6. ...
    7. while(flag)
    8. { EnumThreadWindows(pi.dwThreadId, HideThreadWndProc, 0); }
    Работает для всех процессов, но окошко успевает мигнуть на мгновение. К сожалению это не устраивает. Может есть какие-то более корректные для данной ситуации методы?

    ЗЫ Про создание процесса в другом десктопе знаю, к сожалению тоже не подходит.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Rel
    перехватить создание окна, и ShowWindow?
     
  3. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    а не легче ли просто создать на другом десктопе и не заниматься этим гемороем?
     
  4. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    а, сорри)) не увидел сразу)
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    спасибо, но я не хочу использовать пацанские алгоритмы для такой задачи)) на машинах стоят последние кисы, то есть WriteProcessMemory не обойдешься, а делать что-то сложнее не хочется)) скажите, а можно ли создаваемое окно извне запихать по z-индексу за десктоп?
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Ы! а вообще тут понимаете какая проблема, окно то создается в одном потоке, а скрыть вы хотите в другом, таким образом всегда будет вероятность "мелькания". Короче я хз тогда как. А вы скожите почему на другой десктоп нельзя?
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Ну тогда так: создать окно на весь экран, вывести в него предварительно снятый скриншот десктопа ;) а потом тихонько спрятать.
     
  8. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    а, сори - чужое окно... не пойдет
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Ну прям на днях наткнулся на ранее незамеченный аналогичный топик с WASM.BEGINNERS - как запустить программу скрытой, решил было поучаствовать задним числом - да и забыл. И вот та же тема, напомнили :)
     
  10. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Не проще окна вообще не создавать?
     
  11. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Всего лишь пример решения в частном случае:
    скрытно запускаем Process Hunter by Ms-Rem
    (не забываем вписать свой путь :)

    P.S. Всякий, кто приступает к задаче скрытного запуска, первым делом обнаруживает, что штатное средство от MS -
    - срабатывает далеко не всегда.
    Зависит от конкретной проги.
    А уж если в прогу включить противодействие скрытому запуску - то ваще...

    Кстати, для модальных диалогов можно заранее установить, сможет ли этот флаг управлять состоянием окна диалога при запуске:
    хотите, чтоб не влиял - вставьте в шаблон модального диалога WS_VISIBLE.
     
  12. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Это все бесполезно. Мужик хочет, что любой процесс запускаемый из "него" не открывал никаких окон. Это явно "пацанская прога" получится, но он талдычит
    .
     
  14. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Замена предыдущему наброску. Теперь - 2 варианта решения. Проверено только на XP.
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
  16. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    На SP3 не запускается.
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Twister
    Вот черт... И sp3 под рукой нет, покопаться... Как думаете - на что там похоже?
     
  18. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Код (Text):
    1. main:
    2. invoke CreateProcess,addr buf,0,0,0,FALSE,NORMAL_PRIORITY_CLASS,0,0,addr sis,addr pi
    3. mov eax,pi.dwProcessId
    4. mov pid,eax
    5. invoke FixPid,eax
    6.  
    7. hookproc:
    8. .if nCode==HCBT_CREATEWND
    9.     invoke GetWindowThreadProcessId,wParam,addr var
    10.     mov edx,var
    11.     .if edx==pid
    Race Condition :)
    Поскольку процесс создаётся не засуспенженым, то он может создать окно быстрее, чем будет выполнена FixPid. Впрочем, к вопросу об xp sp3 это не должно относиться.

    Интересная особенность при следующих параметрах на Win7 x64:
    [​IMG]
    Окно winver'а таки появляется и тут же скрывается. А если так запустить калькулятор, то он появится, скроется, и снова появится. Похоже, там механизм тотальной отображаемости.

    Пользуясь случаем, хотелось бы спросить насчёт "invoke CallNextHookEx,hhook,nCode,wParam,lParam". Подобное встречали уже в нескольких программах (в трёх, на самом деле) и никак не можем интерпретировать включение выделенного параметра в код хука. Действительно – "invoke SetWindowsHookEx,WH_CBT,offset HookProc,hinst,0; mov hhook,eax" – hhook может принять осмысленное значение уже после выполнения "CallNextHookEx, hhook,..". Значит, опять Race Condition, ведущее к потенциальному трудноуловимому багу — точнее, было бы RaceCondition, если бы CallNextHookEx не игнорировала значение этого параметра. [...в целях экономии пространства здесь было вырезано полкилобайта бесценных рассуждений]. Таким образом, есть ли какая-то ускользнувшая от нас причина вставления hhook в расшаренную секцию хуковой длл?
     
  19. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Sol_Ksacap
    msdn говорит что hHook нужен только в win9x
    http://msdn.microsoft.com/en-us/library/ms644974%28VS.85%29.aspx
     
  20. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    GoldFinch
    Да, мы учитывали эти данные из msdn – схождения всё равно не получается.