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

Поиск:

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


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 21.1.2004
Где: Belarus, Borisov

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



Помогите пжалста определить ID иконки в трее сторонней тулзы (надо для удаления этой иконки с трея). qstn.gif
PM MAIL WWW ICQ AOL YIM MSN   Вверх
_hunter
Дата 10.8.2004, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



нельзя его определить sad.gif
( одно время сам пытался )
разве-что хук цеплять


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AlexxO
Дата 10.8.2004, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 21.1.2004
Где: Belarus, Borisov

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



Цитата
нельзя его определить
( одно время сам пытался )
разве-что хук цеплять

ну а как тогда скрыть иконку стороннего приложения в трее по-другому?
PM MAIL WWW ICQ AOL YIM MSN   Вверх
_hunter
Дата 10.8.2004, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а фиг его знает smile.gif


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Girder
Дата 11.8.2004, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



ID пока не смог определить... но вот вполне рабочий пример

Код
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, CommCtrl;

type
PTB_Info=^TTB_Info;
TTB_Info=record
idButton:integer;
iButton:integer;
TBW32:HWND;
Hide:boolean;
end;

type
 TForm1 = class(TForm)
   tvButton: TTreeView;
   bDelete: TButton;
   bUpdate: TButton;
   procedure bUpdateClick(Sender: TObject);
   procedure tvButtonCustomDrawItem(Sender: TCustomTreeView;
     Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
   procedure FormCreate(Sender: TObject);
   procedure bDeleteClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   function GetButtonText_TBW32(TBW32:HWND;idButton:integer;var Text:String):boolean;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
//CommCtrl - Для тех кто не знает
function TForm1.GetButtonText_TBW32(TBW32:HWND;idButton:integer;var Text:String):boolean;
var opTBW32,ID_TBW32:Cardinal;
   lT,j:integer;
   s:string;
   sP:Pointer;
begin
Result:=false;
ID_TBW32:=0;
GetWindowThreadProcessId(TBW32,@ID_TBW32);
if ID_TBW32=0 then exit;
opTBW32:=OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ,false,ID_TBW32);
if opTBW32<>0 then
 begin
  Text:='';
  lT:=SendMessage(TBW32,TB_GETBUTTONTEXT,idButton,0);
  if lT<>-1 then
   begin
    SetLength(s,lT*2);
    sP:=VirtualAllocEx(opTBW32,nil,Length(s),MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE);
    if sP<>nil then
     begin
      lT:=SendMessage(TBW32,TB_GETBUTTONTEXT,idButton,integer(sP));
      if (lT<>-1)and(ReadProcessMemory(opTBW32,sP,PChar(s),lT,Cardinal(j))) then
       begin
        Text:=Copy(s,1,lT);
        Result:=true;
       end;
      VirtualFreeEx(opTBW32,sP,0,MEM_RELEASE);
     end;
   end;
  CloseHandle(opTBW32);
 end;
end;

procedure TForm1.bUpdateClick(Sender: TObject);
var TrayWnd,TrayNW,TraySysPager,TrayTB32: HWND;
   i,k:integer;
   s:string;
   t:TTreeNode;
   b:PTB_Info;
begin
tvButton.Items.Clear;
TrayWnd:=findwindow('Shell_TrayWnd', nil);
if TrayWnd=0 then exit;
TrayNW:=findwindowex(TrayWnd,0,'TrayNotifyWnd', nil);
if TrayNW=0 then exit;
TraySysPager:=findwindowex(TrayNW,0,'SysPager', nil);
if TraySysPager=0 then exit;
TrayTB32:=findwindowex(TraySysPager,0,'ToolbarWindow32', nil);
if TrayTB32=0 then exit;
i:=SendMessage(TrayTB32,TB_BUTTONCOUNT,0,0);
Form1.Caption:='Программ в трее: '+IntToStr(i);
if (i>0) then
 begin
  k:=0;
  repeat
   if SendMessage(TrayTB32,TB_COMMANDTOINDEX,k,0)>=0 then
    begin
     dec(i);
     New(b);
     b^.iButton:=SendMessage(TrayTB32,TB_COMMANDTOINDEX,k,0);
     b^.idButton:=k;
     b^.TBW32:=TrayTB32;
     if Boolean(SendMessage(TrayTB32,TB_ISBUTTONHIDDEN,k,0)) then
       b^.Hide:=false else b^.Hide:=true;
     if GetButtonText_TBW32(TrayTB32,k,s)=false then
      s:='idButton: '+IntToStr(k);
     if SendMessage(TrayTB32,TB_ISBUTTONENABLED,k,0)=0 then
      s:=s+' - Похоже на мусор =)!';
     t:=tvButton.Items.AddChild(nil,s);
     t.Data:=b;
    end;
   inc(k);
  until (i=0);
 end;
end;

procedure TForm1.tvButtonCustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if (Node.Data<>nil) then
 if (PTB_Info(Node.Data)^.Hide) then Sender.Canvas.Font.Color:=clBlack else
  Sender.Canvas.Font.Color:=clGray;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bUpdate.Click;
end;

procedure TForm1.bDeleteClick(Sender: TObject);
var b:PTB_Info;
   t:TTreeNode;
begin
t:=tvButton.Selected;
if t<>nil then
 begin
  b:=t.Data;
  if Boolean(SendMessage(b^.TBW32,TB_DELETEBUTTON,b^.iButton,0)) then
   begin
    Dispose(b);
    t.Delete;
    bUpdate.Click;
   end;
 end;
end;

end.


Завтра дальше покопаю MSDN

Это сообщение отредактировал(а) Girder - 14.8.2004, 01:34


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
_hunter
Дата 11.8.2004, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а весь проект можно ( а то Delphi под рукой нет, а поиграться хочется )?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Girder
Дата 11.8.2004, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



Какой проект? Скомпилированный файл?
Я пока не могу прикреплять файлы к сообщению.

_hunter идея проста. Делается трассировка по всем кнопкам в ToolBar-е. Определяется их номера и всплывающая подсказка. И в обработчике bDeleteClick происходит удаление желаемой кнопки(то есть не обходимый результат достигнут). А на счет ID иконки, мне просто самому хочется это определить, так как хочется найти рещения(на будушее для себя) как обойти ошибки в XP связанные с не правильной выдачи результатов на некоторые сообщения(TB_). В MSDN описание этих багов есть, а вот пути решений нет. Кстати, я не вижу проблемм перенести этот код на Си.

P.S. _hunter ту статью(CreateProcess) я не нашел. Но если в кратце там следущее(исходник текста на англ): Один аналитик описывал проблеммы безопасности и некоторые выводы касались ShellExecute, типо: Об возможном ограничения функциональности данной функции в дальнейшем.



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Girder
Дата 11.8.2004, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



Подправил код, см. выше.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 12.8.2004, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



А может есть функция типа WindowFromPoint
PM MAIL   Вверх
Girder
Дата 12.8.2004, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



Клиенскую область ты можеш определить только для видемых иконок и то применение WindowFromPoint для них тебе ни чего не даст.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Girder
Дата 25.8.2004, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



_hunter у меня получилось и картинки извлечь. wink.gif

Если тебе или кому будет интересно, могу исходники выложить.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
_hunter
Дата 25.8.2004, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



очень интересно


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Girder
Дата 25.8.2004, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



Все очень просто оказалось.

Можно получить иконки исходя из этого: SendMessage(TrayTB32,TB_GETIMAGELIST,0,0);
НО есть для WinXP маленькая проблеммка: http://support.microsoft.com/default.aspx?...Ben-us%3B811415

Все ниже сказанное справедливо для WinXP, на остальных пока не проверял
(для более ранних Win через TB_GetImageList и типо того).

По этому я пошел другим путем...
-По путно приняв следующие данные
1)Tray - Это даже не совсем окно
2)Кнопки - в tray это просто картинки.
3) См. выше код: У нас в принципе все есть, и более того мы можем любому приложению в Tray заменить картинку послав сообщение TB_CHANGEBITMAP
4)Да и как видно из кода(см.выше)... любую кнопку мы можем удалить

Как видно дело осталось только в красоте приложения... что бы с картинками...

1)Нам надо раскрыть Tray:
Код
SendMessage(findwindowex(TrayNW,0,'Button',nil),BM_CLICK,0,0);


2)Определить размер занимаемыми иконками и просто копируем их из Tray
Код

procedure GetImageList(oo:HWND;W,H,c:Integer);
var bmp,bmp2:TBitmap;
   l:TColor;
   x,xi,y,xc:integer;
begin
xi:=W div c;
if (c>0)and(xi>=16) then
 begin
  bmp:=TBitmap.Create;
  bmp.Width:=W;
  bmp.Height:=H;
  BitBlt(bmp.Canvas.Handle,0,0,W,H,GetDC(oo),0,0,SRCCopy);
  l:=Bmp.Canvas.Pixels[0,0];
  xi:=(xi-16);
  x:=xi div 2;
  if x=0 then x:=xi mod 2;
  y:=(H-16) div 2;
  if y=0 then y:=(H-16) mod 2;
  xc:=0;
  bmp2:=TBitmap.Create;
  bmp2.Width:=c*16;
  bmp2.Height:=16;
  repeat
   dec(c);
   BitBlt(bmp2.Canvas.Handle,xc,0,16,16,GetDC(oo),x,y,SRCCopy);
   x:=x+16+xi;
   xc:=xc+16;
  until (c=0);
  Form1.tvButton.Images.AddMasked(bmp2,l);
  bmp2.Free;
  bmp.Free;
 end;
end;
....
procedure TForm1.bUpdateClick(Sender: TObject);
....
TrayTB32:=findwindowex(TraySysPager,0,'ToolbarWindow32', nil);
if TrayTB32=0 then exit;
tvButton.Images:=TImageList.Create(tvButton);

gggg:=SendMessage(TrayTB32,TB_GETTOOLTIPS,0,0);
if gggg<>0 then
 begin
  i:=SendMessage(gggg,TTM_GETTOOLCOUNT,0,0);
  GetWindowThreadProcessId(gggg,@ID_TBW32);
  if (i>0)and(ID_TBW32<>0) then
   begin
    nnn:=i-1;
    mmm:=0;
    opTBW32:=OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,false,ID_TBW32);
    if opTBW32<>0 then
     begin
      sB:=SizeOf(TToolInfo);
      repeat
       dec(i);
       FillChar(rrrr,sB,#0);
       rrrr.cbSize:=sB;
       tbbP:=VirtualAllocEx(opTBW32,nil,sB,MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE);
       if tbbP<>nil then
        begin
         if WriteProcessMemory(opTBW32,tbbP,@rrrr,sB,j)and(j=sB)and
            (SendMessage(gggg,TTM_ENUMTOOLS,i,integer(tbbP))=1)and
            (ReadProcessMemory(opTBW32,tbbP,@rrrr,sB,j))and(j=sB) then
          begin
           if mmm<=rrrr.Rect.Right then mmm:=rrrr.Rect.Right;
          end;
         VirtualFreeEx(opTBW32,tbbP,0,MEM_RELEASE);
        end;
      until (i=1);
      GetImageList(TrayTB32,mmm,rrrr.Rect.Bottom,nnn); //Копируем
      CloseHandle(opTBW32);
     end;
   end;
 end;


3)Закрываем Tray
Код
SendMessage(findwindowex(TrayNW,0,'Button',nil),BM_CLICK,0,0);


У нас все есть... а индексы картинок будут совпадать с Нулевыми индексами кнопок, т.е. b^.iButton.

_hunter понял?

Ладно к завтра перепешу польностью код и погоняю и тогда полностью выложу весь код.

Кстати, а к моему посту модератор может прицепить вложенные файлы? Что бы и исходники... и скомпилированный прогу подцепить?


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Girder
Дата 3.9.2004, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



Прога готова. Теперь бы кто помог её подцепить к сообщению для тестирования. А?


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 3.9.2004, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Girder, кидай мне на мыло, прицеплю...




--------------------
С уважением, г-н Посол.
PM   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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