Помощь - Поиск - Пользователи - Календарь
Полная версия: Хук на HCBT_CREATEWND
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Страницы: 1, 2
volvo
Цитата
Хм.. попробовал тормозить все классы, стоящие до TfrmMan (и вместе, и по отдельности - они там повторяются, кстати) - окошко квипа так же появлялось

Неправда smile.gif

      if (pos(UpperCase('tapplication'), UpperCase(GetClName(myWParam))) > 0) or
(pos(UpperCase('madToolsMsgHandler'), UpperCase(GetClName(myWParam))) > 0) or
(pos(UpperCase('madExceptWndClass'), UpperCase(GetClName(myWParam))) > 0) or
(pos(UpperCase('tfrmcore'), UpperCase(GetClName(myWParam))) > 0) then


begin
PostMessage(RHookRec^.AppWindow, MY_MESSAGE, myWParam, 0);
result := 1; Exit;
end;

Этого достаточно, чтоб убить QIP. Ну, в смысле, то окно выбора аккаунта. Тебе надо было всего навсего добавить в возвращаемую в приложение строку еще и хендл объекта и хендл его предка, и посмотреть, от чего же так зависит появление окна на экране. И кто владелец того окна, на котором заканчивается лог (и выбрасывается окно с сообщением об ошибке). Последовательно проходишь назад, уничтожая всех предков, и вот оно, чудо !!! smile.gif

Так что не надо никаких бомб, опытный снайпер с хорошей оптикой может принести гораздо больше вреда smile.gif
Unconnected
Кажется, поправку на ветер забыл smile.gif У меня багрепорта теперь нет, но звук ошибки всё равно булькает.) Тоже по умолчанию выпрыгивает окно выбора аккаунта. Кстати, на единичном уничтожении tfrmcore у меня уже всё крошилось) А чем с теоретической точки зрения плох мой вариант, если не считать перенесение exe в произвольную папку?

В предыдущем посте три смайла образуют равнобедренный тупоугольный треугольник, тонко lol.gif
volvo
Цитата
Можно ведь "приостанавливать" процесс запуска, а в это время убивать процесс, хэндл-то есть...
Можешь показать, как именно ты "приостанавливаешь процесс"? Где это происходит? И как именно ты убиваешь процесс? А потом я скажу, чем будет чреват такой подход, ладно? smile.gif
Unconnected
//uses tlhelp32;

function KillTask(ExeFileName: string): integer;stdcall; //вроде как это из тех 10% кода из сети, который не..
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

function CBTProc(Code: integer; myWParam: WPARAM;
myLParam: LPARAM): LRESULT; stdcall;
var i:integer;
s:string;
begin
if Code < 0 then
begin
Result := CallNextHookEx(RHookRec^.HookID, code, myWParam, myLParam);
exit;
end;
case Code of
HCBT_CREATEWND:
begin
//s:=getclname(mywparam);
sn:=uppercase(handtopath(mywparam));
for i:=1 to fc do begin
if pos(wins[i],sn)>0 then begin
PostMessage(RHookRec^.AppWindow, MY_MESSAGE,wparam(i), 0);
killtask(extractfilename(sn));
break;
end;
end;
end;
end;
result := 0;
end;


Точнее, тут ничего не приостанавливается, просто по создании первого класса будет передан хэндл, по которому сразу опознается, вычислится и уничтожится процесс.. и дальше дело не пойдёт..теоретически)
volvo
Ну не знаю... Ловить HCBT_CREATEWND, и вместо того, чтобы просто вернуть 1 - вызывать стороннюю процедуру, которая будет уничтожать процессы через TerminateProcess (который был, кстати, создан совсем для других целей) - это как-то... Входит как раз в 90% smile.gif Да, а что насчет работы под Win64? Уверен?

Кстати, если уж TerminateProcess - то перебор всех процессов совсем не обязательно делать, достаточно:
  case Code of
HCBT_CREATEWND:
begin
if (pos(UpperCase('tfrmman'), UpperCase(GetClName(myWParam))) > 0) then
begin
PostMessage(RHookRec^.AppWindow, MY_MESSAGE, myWParam, 0);
GetWindowThreadProcessId(myWParam, PID);
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), PID), 0);
result := 1; Exit;
end;

end;

, это точно так же снесет QIP... Останется только провести мышой над треем (или каким-то образом обновить трей, чтоб иконка убитого приложения ушла оттуда).
Unconnected
Ловить HCBT_CREATEWND, и вместо того, чтобы просто вернуть 1

Ну по сути result:=1 и терминатор делают одно и то же, только для первого надо для каждого приложения искать нужные классы, а тут раз и всё smile.gif


Цитата
Да, а что насчет работы под Win64? Уверен?


Попробовал на своей win7 home 64 - перехват работает хорошо - нужные окна виду не показывают. Но вот PostMessage, кажется, недокидывает до основной программы сообщение, но это уже наверное мой косяк.. или не мой..)

Цитата

это точно так же снесет QIP...


Легким движением руки 20 строк превращаются...)))

Ну вроде пока всё работает, спасибо smile.gif
Snake_B
Цитата(volvo @ 20.09.2010 0:44) *

это точно так же снесет QIP... Останется только провести мышой над треем (или каким-то образом обновить трей, чтоб иконка убитого приложения ушла оттуда).


вот кстати вопросик (да и чтобы темы не плодить)...
как можно чужую иконку оттуда убрать... и как её туда вернуть?

удалить то по моему легко можно... а вот как обратно её добавить (и зарегистрировать на родную программу)...
volvo
Цитата
как можно чужую иконку оттуда убрать... и как её туда вернуть?
Попробуй посмотреть вот тут: http://rouse.drkb.ru/winapi.php#fwsystrayinfo , у Rouse_ с Исходников есть пример работы с иконками для WinXP. Чтоб иметь возможность восстановить иконку, надо перед удалением запомнить где-то у себя ту иконку (одну или несколько), которые установлены нужным приложением, а потом послать приложению Shell_NotifyIcon + NIM_ADD
Snake_B
Цитата(volvo @ 20.09.2010 10:28) *

Попробуй посмотреть вот тут: http://rouse.drkb.ru/winapi.php#fwsystrayinfo , у Rouse_ с Исходников есть пример работы с иконками для WinXP. Чтоб иметь возможность восстановить иконку, надо перед удалением запомнить где-то у себя ту иконку (одну или несколько), которые установлены нужным приложением, а потом послать приложению Shell_NotifyIcon + NIM_ADD


о.... спасибо... поковыряю...

> а потом послать приложению Shell_NotifyIcon + NIM_ADD
системному трею послать же?
volvo
Ну да, трею, разумеется...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.