скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Издевательства над 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

Ну, теперь уже лучше? ;)).






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook