PDA

Просмотр полной версии : Скрыть установку программы (чужой)


ZirroCool
30.06.2008, 11:35
Здрасьте всем!
Уважаемые знатоки, есть тема и есть вопрос!
Тема: Нужно скрыть установку сторонней программы, тобеж работу инсталятора!
Вопрос: Как это сделать?

LEE_ROY
30.06.2008, 11:50
передвинуть окошко инсталлятора в невидимую часть экрана ( больше чем разрешение ), и там поклацать по кнопкам, ченить типа такого )

ZirroCool
30.06.2008, 11:52
ага, а как быть с панелью задач на которой будет святиться приложение?

LEE_ROY
30.06.2008, 11:58
покопай вообще в сторону окно, я уверен что и из панели задач убрать его непроблема )

LEE_ROY
30.06.2008, 12:08
вот цытат с sources.ru

Решение проблемы - применить стиль WS_EX_TOOLWINDOW к нужному окну, когда оно SW_HIDE. Т.е. сначала прячем окно, потом ставим стиль, потом делаем окно видимым и на таскбаре ничего не отображается.


Должно срабатывать по SetWindowPos т.е. после замены стилей, надо сделать SetWindowPos с теми же координатами, в принципе когда вы делаете hide/show эта функция вызывается автоматом, так что попробуйте просто после замены стилей SetWindowPos

_empty
30.06.2008, 13:58
попробуй связку FindWindow(class, caption) и после того как получишь хэндл попробуй - ShowWindow(HWND, SW_HIDE) После этого будет светиться только процесс в диспетчере задач.
Причем сохраняется возможность управлять программой через SendMessage, посылая кнопкам инсталятора команды(Нажатие мыши или клавиш). За более подробной информацией на www.google.com

В сети полно исходников по теме скрытия окон.

0x22b
30.06.2008, 14:52
to _empty Не подскажеш как на кнопки влиять через SendMessage().. Например, как закрыть приложение я знаю. SendMessage(hwnd, WM_CLOSE,0,0).. Какие параметры передавать чтобы нажать на кнопку в программе? заранее спс..

izlesa
30.06.2008, 19:05
MSDN forever ^____~

сообщения

http://msdn.microsoft.com/en-us/library/bb775941(VS.85).aspx

и в целом про button, если понадобится

http://msdn.microsoft.com/en-us/library/bb775943(VS.85).aspx

Moldman
30.06.2008, 19:09
На какой Os если виста то сперва отключи Uac

12usver12
30.06.2008, 19:11
аналог делфи
WinExec(PCHAr('D:\инсталятор.EXE'),sw_Hi de);// запуск процесса в скрытом режиме
SendMessage(дескриптор кнопки,BM_Click,0,0); //
дескриптор кнопки ("Далее") ищется через дескриптор окна = FindWindow( 0, ННазвание окнаб...
FindWindow(Дескриптор окна , класс кнопки, ....

и будет тебе счастье

desTiny
30.06.2008, 19:45
аналог делфи
WinExec(PCHAr('D:\инсталятор.EXE'),sw_Hi de);// запуск процесса в скрытом режиме
SendMessage(дескриптор кнопки,BM_Click,0,0); //
дескриптор кнопки ("Далее") ищется через дескриптор окна = FindWindow( 0, ННазвание окнаб...
FindWindow(Дескриптор окна , класс кнопки, ....

и будет тебе счастье
FindWindowEx только

12usver12
30.06.2008, 20:20
FindWindowEx только
не знаю, может быть , недавно подобные шняги на C# делал , там импортировал функцию WinApi - FindWindow и все норм было

izlesa
30.06.2008, 21:05
FindWindow не ищёт дочернии окна. А так она аналогина FindWindowEx. Точнее наоборот ^___^
Так что приминение той или иной функции зависит от задач. Как впрочем и всегда ^___^

da_ff
30.06.2008, 21:58
FindWindow все окна находит по их дескрипторам .
с сендмессейдж может быть проблема, если программа имеет диалоговое окно, там свои нюансы.
самый надежный способ переключить окно в фокус и нажать виртуально кнопку. но для этого окно должно быть видимо

12usver12
30.06.2008, 22:55
виртуальная кнопка , ты имеешь ввиду типа SendKeys.Send("VK_RETURN"); - ентер ,
вот мучил вопрос как наажть на кнопку IE диалогового окна сохранения файла (Запустить Сохранить Отмена) б я знаю 3 способа наажтия через SendMessage
1) SendMessage(Handle, BM_Click,0,0);
2) SendMessage(Handle, BM_SETSTATE,1,0); SendMessage(Handle, WM_KILLFOCUS,0,0);
3) SendMessage(Handle, WM_LBUTTONDOWN,1,0); SendMessage(Handle, WM_LBUTTONUP,0,0);

но ни один не сработал там

_empty
01.07.2008, 00:30
to _empty Не подскажеш как на кнопки влиять через SendMessage().. Например, как закрыть приложение я знаю. SendMessage(hwnd, WM_CLOSE,0,0).. Какие параметры передавать чтобы нажать на кнопку в программе? заранее спс..

Вот код, который нажимает кнопку пуск, а потом прячет ее с экрана на 2 секунды


#include <windows.h>

void main(void)
{
HWND hTaskBar, hButton;
HDC hDCScreen = GetDC(NULL);
DWORD ScreenHeight=GetDeviceCaps(hDCScreen,VERTRES);
ReleaseDC(NULL, hDCScreen);

hTaskBar= FindWindow("Shell_TrayWnd",NULL);
hButton= GetWindow(hTaskBar, GW_CHILD);
// Hажать кнопку "Пуск" предпоследний параметр это кнопка которая нажата, а последний коориднаты курсора мыши.
SendMessage(hButton, WM_LBUTTONDOWN,MK_LBUTTON,LOWORD(5)+
HIWORD(ScreenHeight-20));

// Дальше только ради прикола...
// Спрячем кнопку "Пуск"
ShowWindow(hButton, SW_HIDE);
//спрячем на 2 сек
Sleep(2000);
// Покажем кнопку "Пуск"
ShowWindow(hButton, SW_NORMAL);
}

ZirroCool
01.07.2008, 14:41
а как запустить прогу чтоб ее не было видно, пробовал shellapi winexec createprocess с параметром sw_hide но чет не скрывает?

_empty
01.07.2008, 17:12
а как запустить прогу чтоб ее не было видно, пробовал shellapi winexec createprocess с параметром sw_hide но чет не скрывает?

А что именно не скрывает? WinExec("path+name", SW_HIDE) должен скрывать, если конешн прога сама себя не делает видимой, т.е. назначает себя SW_SHOW, тогда попробуй либо размер окна в 1,1 установить, и перетащить куда нибудь за пределы рабочего стола.

ZirroCool
01.07.2008, 20:00
мне нужно чтобы он запускал ее уже скрытой, тк у нее идет сначала окно заставки!
Потом то я окно скрываю вот так без проблем:
Begin
Wd := FindWindow(nil, 'Хендл');
If Wd<>Form1.Handle then
If IsWindowVisible(WD) then
If not IsIconic(WD) then
If isWindow(WD) then
case n of
1:
ShowWindow(WD, SW_Hide);

А вот как сделать чтоб она скрыто запускалась с самого начала?

И еще у мну в этой проге(прога написана на с++) почему то не отмечается чек бокс, делаю так:
Wd:=FindWindowEx(Wd, 0, 'CheckBox', nil);
SendMessage(Wd, BM_SETcheck,1,0);

хотя на другой проге написанной на дельфях прет(ток там я ставлю ТCheckBox)!

Но самое интересное что кликанье по кнопке, работает в этой проге, делаю вот так:
Wd := FindWindowEx(Wd, 0, 'Button', nil);
SendMessage(Wd, BM_CLICK, 0, 0);
не понятно почему не работает чек бокс?

12usver12
01.07.2008, 20:42
попробуй и отмечание чекбокса сделать через
SendMessage(Wd, BM_CLICK, 0, 0);
или
SendMessage(Handle, BM_SETSTATE,1,0); SendMessage(Handle, WM_KILLFOCUS,0,0);

оно запускает твою прогу скрытой , но любое выскакивающее окошко из этой формы будет видно, в данном случае твоя заставка , тебе остается только запускать таймер и мониторить окно заставки а там уже потом через ShowWindow пряч его

_empty
01.07.2008, 21:19
Если ты хочешь запускать программу в скрытом режиме делай так - WinExec("app_Path+name",SW_HIDE); После этого

MoveWindow(hWnd: HWND, X(int), Y(int), nWidth(int), nHeight(int), bRepaint: BOOL)

где X и Y - новые координаты окна, hWnd - описатель, nWidth и nHeight - новые ширина и высота соответсвенно и bRepaint - перерисовывать окно или нет

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

sn0w
02.07.2008, 00:43
Кез передает
Юзайте пожалуйста CreateDesktop, SetThreadDesktop и CloseDesktop
Ждал, пока в этом топике появится хотя бы 1 здравомыслящий человек, но походу это будет продолжаться бесконечно.
Всем привет!
23:57:22: и после всем привет -
Как дела, пацаны?

ZirroCool
04.07.2008, 17:29
А чез Restorator можно в диалоговом окне сделать так чтобы какой нить чекбокс был отмечен? и как это сделать я чет не понял!

_empty
04.07.2008, 22:59
К сожаленью не получиццо, можно только удалять и добавлять ресурсы, чекбокс не отмечен, хотя мб есть еще какие-нибудь програмы, погугли (www.google.com)

SlyBit
04.07.2008, 23:58
PE Explorer (http://www.cracklab.ru/download.php?action=list&n=MzU=) подойдет

ZirroCool
05.07.2008, 16:49
SlyBit, вроде эта прога такая же как и ресторатор в ней я тож не нашел способа отметить чек бокс! Может обьяснишь?

SlyBit
05.07.2008, 19:14
ZirroCool
Сорри, перепутал, отметить чекбокс через редактор ресурсов нельзя (по крайней мере для программ, скомпилированных борладским компилятором), можно только снять метку с него.
Я так понял, ты через апи имитируешь нажатия кнопок пользователем, шли тогда сообщение чекбоксу SendMessage(hCheckbox, BM_SETCHECK, 1, 0).

sn0w
Менять рабочие столы можно только для своего процесса.

ZirroCool
05.07.2008, 19:51
в той проге эта хрень не работает SendMessage(hCheckbox, BM_SETCHECK, 1, 0), скорее всему потому что чек бокс в диалоге, так что я хз как сделать по этому и спрашиваю какие могут быть вообще варианты?

_empty
05.07.2008, 20:03
Можно попробовать нажать мышью на CheckBox -
Выставляешь допустим позицию окна заданую запускалось чтобы там, для удобства 0,0 например.
отмеряешь, сколько примерно до чекбокса пикселей по x и y, а дальше уже имитируешь нажатие мыши в заданном месте, должен нажаться чекбокс.

SlyBit
05.07.2008, 20:38
ZirroCool

Тебе нужно получить хэдл окна чекбокса, для этого перебираешь все дочерние окна главной формы функцией EnumChildWindows(hMain, EnumChildProc, 0);.
hMain - хэдл окна главной формы, его получаешь функией FindWindow(0, "FormTitle").
EnumChildProc - функция перебора дочерних окон. Возвращает 1 для продолжения перебора окон, 0 для прекращения. Первый параметр - хэдл очередного дочернего окна.

BOOL CALLBACK EnumChildProc(HWND hwnd , LPARAM lParam)
{
char szWindowText[255];

// Получаем заголовок окна
GetWindowText(hwnd, szWindowText, 255);

// Сравниваем с нашим, если нашли, то ставим галочку и останавливаем перебор
if(!lstrcmp(szWindowText, "CheckBox1")) {
SendMessage(hwnd, BM_SETCHECK, 1, 0);
return 0;
}
return 1;
}

BOOL WINAPI ProcessControl()
{
HWND hMain;

if(!(hMain = FindWindow(0, "FormTitle"))) {
return 0;
}

EnumChildWindows(hMain, EnumChildProc, 0);
return 1;
}

Таким образом можно искать любое окно на форме.

sn0w
07.07.2008, 14:14
ZirroCool
Сорри, перепутал, отметить чекбокс через редактор ресурсов нельзя (по крайней мере для программ, скомпилированных борладским компилятором), можно только снять метку с него.
Я так понял, ты через апи имитируешь нажатия кнопок пользователем, шли тогда сообщение чекбоксу SendMessage(hCheckbox, BM_SETCHECK, 1, 0).

sn0w
Менять рабочие столы можно только для своего процесса.


есть такое поле lpDesktop в STARTUPINFO ...

SlyBit
07.07.2008, 15:09
sn0w

Твоя правда, раньше не обращал внимания. Хотя опять же, смысл создавать рабочий стол, если можно просто полю wShowWindow присвоить значение SW_HIDE.

Delimiter
07.07.2008, 15:32
Кез передает
Юзайте пожалуйста CreateDesktop, SetThreadDesktop и CloseDesktop
Ждал, пока в этом топике появится хотя бы 1 здравомыслящий человек, но походу это будет продолжаться бесконечно.
Всем привет!
23:57:22: и после всем привет -
Как дела, пацаны?

... блин , а заюзать какое нидь имя типа _K_E_Z_ ??