Просмотр полной версии : Скрыть установку программы (чужой)
ZirroCool
30.06.2008, 11:35
Здрасьте всем!
Уважаемые знатоки, есть тема и есть вопрос!
Тема: Нужно скрыть установку сторонней программы, тобеж работу инсталятора!
Вопрос: Как это сделать?
передвинуть окошко инсталлятора в невидимую часть экрана ( больше чем разрешение ), и там поклацать по кнопкам, ченить типа такого )
ZirroCool
30.06.2008, 11:52
ага, а как быть с панелью задач на которой будет святиться приложение?
покопай вообще в сторону окно, я уверен что и из панели задач убрать его непроблема )
вот цытат с sources.ru
Решение проблемы - применить стиль WS_EX_TOOLWINDOW к нужному окну, когда оно SW_HIDE. Т.е. сначала прячем окно, потом ставим стиль, потом делаем окно видимым и на таскбаре ничего не отображается.
Должно срабатывать по SetWindowPos т.е. после замены стилей, надо сделать SetWindowPos с теми же координатами, в принципе когда вы делаете hide/show эта функция вызывается автоматом, так что попробуйте просто после замены стилей SetWindowPos
попробуй связку FindWindow(class, caption) и после того как получишь хэндл попробуй - ShowWindow(HWND, SW_HIDE) После этого будет светиться только процесс в диспетчере задач.
Причем сохраняется возможность управлять программой через SendMessage, посылая кнопкам инсталятора команды(Нажатие мыши или клавиш). За более подробной информацией на www.google.com
В сети полно исходников по теме скрытия окон.
to _empty Не подскажеш как на кнопки влиять через SendMessage().. Например, как закрыть приложение я знаю. SendMessage(hwnd, WM_CLOSE,0,0).. Какие параметры передавать чтобы нажать на кнопку в программе? заранее спс..
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
На какой Os если виста то сперва отключи Uac
12usver12
30.06.2008, 19:11
аналог делфи
WinExec(PCHAr('D:\инсталятор.EXE'),sw_Hi de);// запуск процесса в скрытом режиме
SendMessage(дескриптор кнопки,BM_Click,0,0); //
дескриптор кнопки ("Далее") ищется через дескриптор окна = FindWindow( 0, ННазвание окнаб...
FindWindow(Дескриптор окна , класс кнопки, ....
и будет тебе счастье
аналог делфи
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 и все норм было
FindWindow не ищёт дочернии окна. А так она аналогина FindWindowEx. Точнее наоборот ^___^
Так что приминение той или иной функции зависит от задач. Как впрочем и всегда ^___^
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);
но ни один не сработал там
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 но чет не скрывает?
а как запустить прогу чтоб ее не было видно, пробовал 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 пряч его
Если ты хочешь запускать программу в скрытом режиме делай так - 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 , которая может из файла вырезать ресурсы, так вот, я рекомендую вырезать всякие заставки и все такое, или отредактировать их так, что они будут не видны, тогда никаких проблем с внезапным выскакивающим окошком не будет.
Кез передает
Юзайте пожалуйста CreateDesktop, SetThreadDesktop и CloseDesktop
Ждал, пока в этом топике появится хотя бы 1 здравомыслящий человек, но походу это будет продолжаться бесконечно.
Всем привет!
23:57:22: и после всем привет -
Как дела, пацаны?
ZirroCool
04.07.2008, 17:29
А чез Restorator можно в диалоговом окне сделать так чтобы какой нить чекбокс был отмечен? и как это сделать я чет не понял!
К сожаленью не получиццо, можно только удалять и добавлять ресурсы, чекбокс не отмечен, хотя мб есть еще какие-нибудь програмы, погугли (www.google.com)
PE Explorer (http://www.cracklab.ru/download.php?action=list&n=MzU=) подойдет
ZirroCool
05.07.2008, 16:49
SlyBit, вроде эта прога такая же как и ресторатор в ней я тож не нашел способа отметить чек бокс! Может обьяснишь?
ZirroCool
Сорри, перепутал, отметить чекбокс через редактор ресурсов нельзя (по крайней мере для программ, скомпилированных борладским компилятором), можно только снять метку с него.
Я так понял, ты через апи имитируешь нажатия кнопок пользователем, шли тогда сообщение чекбоксу SendMessage(hCheckbox, BM_SETCHECK, 1, 0).
sn0w
Менять рабочие столы можно только для своего процесса.
ZirroCool
05.07.2008, 19:51
в той проге эта хрень не работает SendMessage(hCheckbox, BM_SETCHECK, 1, 0), скорее всему потому что чек бокс в диалоге, так что я хз как сделать по этому и спрашиваю какие могут быть вообще варианты?
Можно попробовать нажать мышью на CheckBox -
Выставляешь допустим позицию окна заданую запускалось чтобы там, для удобства 0,0 например.
отмеряешь, сколько примерно до чекбокса пикселей по x и y, а дальше уже имитируешь нажатие мыши в заданном месте, должен нажаться чекбокс.
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;
}
Таким образом можно искать любое окно на форме.
ZirroCool
Сорри, перепутал, отметить чекбокс через редактор ресурсов нельзя (по крайней мере для программ, скомпилированных борладским компилятором), можно только снять метку с него.
Я так понял, ты через апи имитируешь нажатия кнопок пользователем, шли тогда сообщение чекбоксу SendMessage(hCheckbox, BM_SETCHECK, 1, 0).
sn0w
Менять рабочие столы можно только для своего процесса.
есть такое поле lpDesktop в STARTUPINFO ...
sn0w
Твоя правда, раньше не обращал внимания. Хотя опять же, смысл создавать рабочий стол, если можно просто полю wShowWindow присвоить значение SW_HIDE.
Delimiter
07.07.2008, 15:32
Кез передает
Юзайте пожалуйста CreateDesktop, SetThreadDesktop и CloseDesktop
Ждал, пока в этом топике появится хотя бы 1 здравомыслящий человек, но походу это будет продолжаться бесконечно.
Всем привет!
23:57:22: и после всем привет -
Как дела, пацаны?
... блин , а заюзать какое нидь имя типа _K_E_Z_ ??
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot