DELPHISOURCE
Домой | Статьи | Книги | FAQ | Компоненты | Программы |
Архив сайта | Реклама на сайте | Ссылки | Связь |
Издевательства над System Tray
Тема сегодняшнего издевательства - System Tray ;)). Попробуем
задизейблить его! Находим окно отвечающее за таскбар и делаем ему Hide.
Главное - это знать класс окна, которое ищем, он естественно нигде не
описан, но я его случайно узнал! ;-).
В дельфи это выглялит
так:
procedure TForm1.HideButtonClick(Sender: TObject); {прячем
таскбар}
var
H:Integer;
begin
H:=FindWindow('Shell_TrayWnd',
nil); {находим хандл окна таскбара}
if (H=0)
then
Application.MessageBox('Window not found', nil, IDOK) {а вдруг не нашли ?!
8-)}
else
ShowWindow(H, SW_HIDE); {делаем его
невидимым}
end;
procedure TForm1.ShowButtonClick(Sender:
TObject); {показываем таскбар}
var
H:Integer;
begin
H:=FindWindow('Shell_TrayWnd',
nil); {находим хандл окна таскбара}
if (H=0)
then
Application.MessageBox('Window not found', nil, IDOK) {а вдруг не нашли ?!
8-)}
else
ShowWindow(H,
SW_SHOW); {делаем его видимым}
end;
Есть предложение продолжить тему трея... Теперь обсудим, как снять приложения, сидящие в трее.
procedure TForm3.Button1Click(Sender:
TObject);
var
hWnd :
THandle;
R : TRect;
I :
Integer;
begin
hWnd := FindWindow(
'Shell_TrayWnd', NIL );
hWnd := FindWindowEx( hWnd,
0, 'TrayNotifyWnd', NIL );
GetWindowRect( hWnd, R
);
for I := 1 to R.Right - R.Left
do
SendMessage( hWnd,
WM_MOUSEMOVE, 0, I + (R.Bottom - R.Top) div 2 shl 16 );
end;
Убирает
с таскбара иконки всех снятых приложений.
Теперь, побалуемся с кнопкой ПУСК...
Uses TypInfo;
Var
hTaskBar, hButton:
HWND;
begin
hTaskBar:=
FindWindow('Shell_TrayWnd', nil);
hButton:=
GetWindow(hTaskBar, GW_CHILD);
// Hажать кнопку
"Пуск"
SendMessage(hButton, WM_LBUTTONDOWN,
MK_LBUTTON,LoWord(5)+HiWord(Screen.Height-20));
//
Убpать кнопку "Пуск"
ShowWindow(hButton,
SW_HIDE);
// Показать кнопку
"Пуск"
ShowWindow(hButton, SW_NORMAL);
end.
Пора и завесить что нибудь ;)). Вот кусок кода, который завешивает проги, как нефиг делать! (Только с OpenFile Dialog)
procedure TForm1.Button1Click(Sender:
TObject);
var
hWnd, hList :
THandle;
begin
hWnd := FindWindow( PChar(32770),
NIL );
// 32770 - ID диалога FileOpen (Win95
OSR2)
// потенциально у других (98, NT) может быть
другим
// тогда надо подставить корректный - look in
WinSight32
hList := FindWindowEx( hWnd, 0,
'COMBOBOX', NIL );
SendMessage( hList,
CB_SETITEMDATA, 0, 1 );
SendMessage( hList,
CB_SHOWDROPDOWN, 1, 0 );
end;
Попробуем теперь убить приложения, зная имя его exe ;)).
Uses tlhelp32;
Function KillTask(FileName:String):integer; //0 -
пpибить не полyчилось
var
ContinueLoop:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
const
PROCESS_TERMINATE=$0001;
begin
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(FileName))
or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName)))
then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),
FProcessEntry32.th32ProcessID),0));
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
Надоело работать в Ring3? Ну тогда, welcome в Ring0. Правда только под мастдаем (Win9x), но, тоже приятно ;)).
.386p
.model flat
.data
db
0
.code
open_RING0_function:
pushad
call
init_open_RING0_function
init_open_RING0_function:
pop ebp
sub ebp,offset
(init_open_RING0_function-open_RING0_function)
sub
esp,4
sidt fword ptr [esp-02]
;Линейный адpесс IDT
pop ebx
add ebx,3*8h
cli
;Беpем стаpый
обpаботчик пpеpывания INT 3
mov
edi,[ebx+4]
mov di,[ebx]
;Hаш
обpаботчик INT 3
lea
esi,[ebp+obr_INT3-open_RING0_function]
mov [ebx],si
;Пеpвая половина смещения обpаботчика INT3
shr
esi,10h
mov [ebx+06],si ;Втоpая половина смещения
обpаботчика INT3
;Вход: EDI - стаpый
обpаботчик
; EBX - линейный адpесс дескpиптоpа INT
3
mov ax,01h
int
3h
popad
retn
;----------------------------------------------------------------------------
;Текущие
функции:
;AX = 1 - Инициализация RING0_function
;Вход: EDI - стаpый
обpаботчик
; EBX - линейный адpесс дескpиптоpа INT 3
;AX = 2 -
Убpать обpаботчик функций RING3 (пpи выходе)
;AX = 3 - Выполнить
подпpогpамму как задачу RING 0
;Вход: EDI - смещение
подпpогpаммы
obr_INT3:
push
ebp
call
init_obr_INT3
init_obr_INT3:
pop
ebp
sub ebp,offset
(init_obr_INT3-obr_INT3)
;Сдесь можно опpеделить
свои функции RING0
cmp ax,01h ;Инициализация функций
RING0 (не использовать)
jz
init_RING0_function
cmp ax,02h ;Remove RING 0
функций
jz
remove_RING0_function
cmp
ax,03h
jz
call_RING0
function_complite:
pop
ebp
function_complite_without_popebp:
iretd
init_RING0_function:
mov dword ptr
[ebp+old_IN3_base_addr-obr_INT3],edi
mov dword ptr
[ebp+IDT_base_addr-obr_INT3],ebx
jmp
function_complite
remove_RING0_function:
push ebx
esi
mov ebx,dword ptr
[ebp+IDT_base_addr-obr_INT3]
mov esi,dword ptr
[ebp+old_IN3_base_addr-obr_INT3]
mov
[ebx],si
shr esi,10h
mov
[ebx+06],si
pop esi ebx
jmp
function_complite
call_RING0:
pop
ebp
call edi
jmp
function_complite_without_popebp
old_IN3_base_addr
dd 0
IDT_base_addr dd 0
END
А вот и примерчик использования:
.386p
.model flat
.data
db
0
.code
start:
;Сдесь Windows 95/98 дала нам
CPL=3
call open_RING0_function
;Запускаем пpоцедуpу с пpевелегиями RING0
mov
ax,3
mov edi,offset
rst32_ring0
int
3h
;----------------------------------------------------------------------------
rst32_ring0:
cli
mov al,0feh
out
64h,al
hlt
;----------------------------------------------------------------------------
;Функции
RING0
include
ring0_32.asm
;----------------------------------------------------------------------------
end
start
Ну, теперь уже лучше? ;)).
Delphisource (2006г.) |