Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скрыть чужое приложение с панели задач 
:(
    Опции темы
neweraser
Дата 2.7.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



вот такой вот у меня вопрос...
допустим запустил я приложение, захотелось его спрятать, запускаю программку, а она прячет себя и то приложение, можно так сделать?


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
system
Дата 2.7.2008, 15:53 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 16.5.2008

Репутация: нет
Всего: 2



можно  smile 
PM MAIL   Вверх
THandle
Дата 2.7.2008, 22:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3618
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



Цитата(system @  2.7.2008,  16:53 Найти цитируемый пост)
можно


Думаю да.

Сегодня посидел, подумал, поразбирался с сообщениями TB_XXXXX, получил такой вот результат:

То что нам потребуется:
Код

const
  TB_GETBUTTON     = WM_USER + 23;
  TB_BUTTONCOUNT   = WM_USER + 24;
  TB_GETBUTTONTEXT = WM_USER + 75;
  TB_DELETEBUTTON  = WM_USER + 22;

type
  TTBBUTTON = record
    iBitmap : Integer;
    idCommand : Integer;
    fsState : byte;
    fsStyle : byte;
    {$IFDEF WIN64}
    hReserved : array [0..5] of byte;
    {$ELSE}
    {$IFDEF WIN32}
    hReserved : array [0..1] of byte;
    {$ENDIF}
    {$ENDIF}
    dwData : Pointer;
    iString : PChar;
  end;



1. Получается получить список всех кнопок на панели задач. Сначала не получалось, потом пришлось вспоминать API, которые я не знаю... В общем вот что получилось, за код не ругать плиз smile :


Код

procedure TForm1.Button1Click(Sender: TObject);
const
  BUFFER_SIZE = $1000;
var
  OpProc : THandle;
  ProcID : THandle;
  ToolBar : THandle;
  Window : HWND;
  ButtonsCount : integer;
  i : Integer;
  Buffer : Pointer;
  DButton : TTBButton;
  RBytes : Cardinal;
  BTextLength : Integer;
  BText : WideString;
begin
  ToolBar := FindWindow('Shell_TrayWnd', nil);
  ToolBar := FindWindowEx(ToolBar, 0, 'ReBarWindow32', nil);
  ToolBar := FindWindowEx(ToolBar, 0, 'MSTaskSwWClass', nil);
  ToolBar := FindWindowEx(ToolBar, 0, 'ToolbarWindow32', nil);
  if ToolBar = 0 then
    Exit;
  ButtonsCount := SendMessage(ToolBar, TB_BUTTONCOUNT, 0, 0);
  GetWindowThreadProcessId(ToolBar, @ProcID);
  OpProc := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
  try
    Buffer := VirtualAllocEx(OpProc, nil, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE);
    for i := 0 to ButtonsCount do
      begin
        SendMessage(ToolBar, TB_GETBUTTON, i, Integer(Buffer));
        RBytes := 0;
        ReadProcessMemory(OpProc, Buffer, @DButton, SizeOf(TTBButton), RBytes);
        ReadProcessMemory(OpProc, DButton.dwData, @Window, SizeOf(HWND), RBytes);
        if Window = 0 then
          Continue;
        BTextLength := SendMessage(ToolBar, TB_GETBUTTONTEXT, DButton.idCommand, Integer(Buffer));
        SetLength(BText, BTextLength);
        ReadProcessMemory(OpProc, Buffer, @(BText[1]), BTextLength * SizeOf(BText[1]), RBytes);
        ListBox1.Items.Add(BText);
      end;
  finally
    VirtualFreeEx(OpProc, Buffer, 0, MEM_RELEASE);
    CloseHandle(OpProc);
  end;
end;


2, получилось удалить все кнопки. Правда некоторые восстанавливаются.

Код

procedure TForm1.Button3Click(Sender: TObject);
var
  h : THandle;
  i, j : integer;
begin
  h := FindWindow('Shell_TrayWnd', nil);
  h := FindWindowEx(h, 0, 'ReBarWindow32', nil);
  h := FindWindowEx(h, 0, 'MSTaskSwWClass', nil);
  h := FindWindowEx(h, 0, 'ToolbarWindow32', nil);
  i := SendMessage(h, TB_BUTTONCOUNT, 0, 0);
  for j := 0 to i - 1 do
    SendMessage(h, TB_DELETEBUTTON, j , 0);
end;


3. Получилось поставить Enabled в false для НУЖНОЙ кнопки. Удалить или скрыть пока не получается((

В общем вывод:

задача, имхо, реально решаемая, просто нужно как следует покавыряться во всем этом и изучить эти вот эту штуку:

http://msdn.microsoft.com/en-us/library/bb760435(VS.85).aspx

завтра, если будет желание то еще посмотрю что там делать...
Вполне возможно что я иду и совсем не по той дороги...

По крайней мере было интересно, и апстенку раз 10 уже убился smile 


ЗЫ: большой спс rrader'у за поправки в коде smile

Это сообщение отредактировал(а) THandle - 3.7.2008, 17:01
PM WWW   Вверх
Virtuals
Дата 3.7.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



neweraser
самое главное для чего? если порнокарты от начальника, мнгновенно 
то идеальный вариант (и условии что ему не нужен трей оболочки, тот который около часов), запустить секретное приложение изначально "спрятанным" smile , на другом столе!!!, а своей програмулиной просто переключать столы. действует мнгновенно и безотказно
PM MAIL ICQ   Вверх
neweraser
Дата 4.7.2008, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Цитата(Virtuals @  3.7.2008,  13:35 Найти цитируемый пост)
если порнокарты от начальника, мнгновенно 

что-то вроде того, сейчас сначала попробую с кодом разобраться, а вот насчет другого стола, это как? я такое только в мандриве видел  smile 


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
THandle
Дата 4.7.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3618
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



neweraser, вот код удаления конкретной кнопки. Просто сравниваешь по заголовку - она или не она. Если она удаляешь.
Только некоторые окна обновляют свою кнопку при активации... Ну это там сам смотри, подходит или нет. Более ничего предложить не могу.

Константы сообщений:

Код

const
  TB_GETBUTTON     = WM_USER + 23;
  TB_BUTTONCOUNT   = WM_USER + 24;
  TB_GETBUTTONTEXT = WM_USER + 75;
  TB_DELETEBUTTON  = WM_USER + 22;


Тип кнопки:
Код


type
  TTBBUTTON = record
    iBitmap : Integer;
    idCommand : Integer;
    fsState : byte;
    fsStyle : byte;
    {$IFDEF WIN64}
    hReserved : array [0..5] of byte;
    {$ELSE}
    {$IFDEF WIN32}
    hReserved : array [0..1] of byte;
    {$ENDIF}
    {$ENDIF}
    dwData : Pointer;
    iString : PChar;
  end;


Процедура удаления, параметр - заголовок окна/кнопки на тулбаре:
Код


procedure DeleteToolBarButton(const ButtonText : WideString);
const
  BUFFER_SIZE = $1000;
var
  OpProc : THandle;
  ProcID : THandle;
  ToolBar : THandle;
  Window : HWND;
  ButtonsCount : integer;
  i : Integer;
  Buffer : Pointer;
  DButton : TTBButton;
  RBytes : Cardinal;
  BTextLength : Integer;
  BText : WideString;
begin
  ToolBar := FindWindow('Shell_TrayWnd', nil);
  ToolBar := FindWindowEx(ToolBar, 0, 'ReBarWindow32', nil);
  ToolBar := FindWindowEx(ToolBar, 0, 'MSTaskSwWClass', nil);
  ToolBar := FindWindowEx(ToolBar, 0, 'ToolbarWindow32', nil);
  if ToolBar = 0 then
    Exit;
  ButtonsCount := SendMessage(ToolBar, TB_BUTTONCOUNT, 0, 0);
  GetWindowThreadProcessId(ToolBar, @ProcID);
  OpProc := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
  try
    Buffer := VirtualAllocEx(OpProc, nil, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE);
    for i := 0 to ButtonsCount do
      begin
        SendMessage(ToolBar, TB_GETBUTTON, i, Integer(Buffer));
        RBytes := 0;
        ReadProcessMemory(OpProc, Buffer, @DButton, SizeOf(TTBButton), RBytes);
        ReadProcessMemory(OpProc, DButton.dwData, @Window, SizeOf(HWND), RBytes);
        if Window = 0 then
          Continue;
        BTextLength := SendMessage(ToolBar, TB_GETBUTTONTEXT, DButton.idCommand, Integer(Buffer));
        SetLength(BText, BTextLength);
        ReadProcessMemory(OpProc, Buffer, @(BText[1]), BTextLength * SizeOf(BText[1]), RBytes);
        if BText = ButtonText then
          begin
            SendMessage(ToolBar, TB_DELETEBUTTON, i, 0);
            Break;
          end;
      end;
  finally
    VirtualFreeEx(OpProc, Buffer, 0, MEM_RELEASE);
    CloseHandle(OpProc);
  end;
end;



Пример вызова:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  DeleteToolBarButton('Диспетчер задач Windows');
end;

PM WWW   Вверх
neweraser
Дата 4.7.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



THandle, спасибо! это как раз то, что мне было нужно!


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Virtuals
Дата 4.7.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



Цитата(neweraser @  4.7.2008,  08:43 Найти цитируемый пост)
Цитата(Virtuals @  3.7.2008,  13:35 )если порнокарты от начальника, мнгновенно что-то вроде того, сейчас сначала попробую с кодом разобраться, а вот насчет другого стола, это как? я такое только в мандриве видел  


 smile  smile 
в этой похожей теме есть вложение в одном из постов, и тоже нечто подобное обсуждалось
http://forum.vingrad.ru/forum/s/b801d0f681...y1569309/0.html
вот оно, изучайте наздоровье, за лишний код ногами не бить, просто тестил
http://forum.vingrad.ru/act-Attach/type/post/id-1569086.html

Это сообщение отредактировал(а) Virtuals - 4.7.2008, 14:51
PM MAIL ICQ   Вверх
Google
  Дата 19.1.2019, 08:59 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.