Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > надо программно нажать на чужую иконку в трее


Автор: sw04 15.7.2007, 22:01
Код

procedure TSnifferThread.Execute ;

var
  I: Integer;
begin
 while not Terminated  do
  Sleep(5000);
  Form21.ListView1.Clear;
  Form21.SysTray.UpdateInfo;
  Form21.ListView1.SmallImages := Form21.SysTray.ImageList;
  for I := 0 to Form21.SysTray.IconCount - 1 do
  begin
    with Form21.ListView1.Items.Add do
    begin
      Caption := GetStateString(Form21.SysTray.IconItem[I].dwState);
      ImageIndex := Form21.SysTray.IconItem[I].iImage;
      SubItems.Add(Form21.SysTray.IconItem[I].szTip);

      if (Form21.SysTray.IconItem[I].szTip = 'Icon') then
      begin
         SendMessage(Form21.SysTray.IconItem[I].hWnd, wm_LButtonDown, 0, 0);
         SendMessage(Form21.SysTray.IconItem[I].hWnd, WM_LButtonUP, 1, 1);
      end;

      SubItems.Add(Form21.SysTray.IconItem[I].szAppPath);

 end;
    end;


  end;

честно не знаю , как нажать на иконку. тыкался, чет не получилось.
знаю, что ошибка в sendmessage, но в  чем именно не пойму.

Автор: MetalFan 15.7.2007, 22:52
простите, но что-то черезчур бредово код выглядит...
зы. если этот код выполняется в потоке, то КАКОГО Х идет обращение к VCL контролам???

Автор: sw04 15.7.2007, 22:56
Цитата(MetalFan @  16.7.2007,  01:52 Найти цитируемый пост)
если этот код выполняется в потоке, то КАКОГО Х идет обращение к VCL контролам???

В vcl выводится только ради контроля.
Естественно в конечном результате останется только последовательность действий, которая останется за кадром.
А так легко контролировать все действия.
Цитата(MetalFan @  16.7.2007,  01:52 Найти цитируемый пост)
простите, но что-то черезчур бредово код выглядит...

Что бредового?
пересматриваю все иконки, если нашел свою(из другого приложения), то нажимаю на неё.

Автор: MetalFan 16.7.2007, 07:45
Цитата(sw04 @  15.7.2007,  22:56 Найти цитируемый пост)
Естественно в конечном результате

так давай конечный, очищенный от бреда, результат.
Цитата(sw04 @  15.7.2007,  22:56 Найти цитируемый пост)
если нашел свою(из другого приложения)

и здесь по-подробнее... что сие фразы означают?

Автор: sw04 16.7.2007, 09:19
Код

procedure TSnifferThread.Execute ;
var
  I: Integer;
begin
 while not Terminated  do
  Sleep(5000);
  SysTray.UpdateInfo;
  for I := 0 to SysTray.IconCount - 1 do
    begin
      if (SysTray.IconItem[I].szTip = 'Icon') then
      begin
         SendMessage(Form21.SysTray.IconItem[I].hWnd, wm_LButtonDown, 0, 0);
         SendMessage(Form21.SysTray.IconItem[I].hWnd, WM_LButtonUP, 1, 1);
      end;
    end;
end;

Просматриваем все иконки в tray с промежутком 5 сек.
Если нашли иконку с hint = 'Icon'(это моя иконка), на неё надо нажать.
Вопрос как нажать? или надо получить координаты иконки - опять же вопрос как?
зы вопрос всего один. как нажать smile

Автор: MetalFan 16.7.2007, 13:47
Цитата(sw04 @  16.7.2007,  09:19 Найти цитируемый пост)
Просматриваем все иконки в tray

ЧТО ЕСТЬ идентификаторы Form21 и SysTray?
фсе, больше в телепатов не играю. надоело

Автор: sw04 16.7.2007, 14:44
Код

type
//Класс потока сниффера
TSnifferThread = class(TThread)
  private
  protected
      procedure Execute; override;
  public
  end;

SysTray: TFWSysTrayInfo;

.... 

procedure TSnifferThread.Execute ;
var
  I: Integer;
begin
 while not Terminated  do
  Sleep(5000);
  SysTray.UpdateInfo;
  for I := 0 to SysTray.IconCount - 1 do
    begin
      if (SysTray.IconItem[I].szTip = 'Icon') then
      begin
         SendMessage(SysTray.IconItem[I].hWnd, wm_LButtonDown, 0, 0);
         SendMessage(SysTray.IconItem[I].hWnd, WM_LButtonUP, 1, 1);
      end;
    end;
end;

Автор: MetalFan 16.7.2007, 16:01
круто)
так не приоткроет ли любезный автор полог тайны, идеж у него создается этот SysTray и что это за компонент такой?
в рамках какого процесса работает поток? и зачем было выносить код в поток

Автор: sw04 16.7.2007, 20:44
Цитата(MetalFan @  16.7.2007,  19:01 Найти цитируемый пост)
так не приоткроет ли любезный автор полог тайны, идеж у него создается этот SysTray и что это за компонент такой?

http://rouse.drkb.ru/winapi.php#fwsystrayinfo

Цитата(MetalFan @  16.7.2007,  19:01 Найти цитируемый пост)
в рамках какого процесса работает поток? и зачем было выносить код в поток 
чтобы повторять операцию несколько раз.
можно на таймерах, но получается больше памяти жрет.

Добавлено через 1 минуту и 7 секунд
Пардон, что так допытываетесь данных. Не знал, что TFWSysTrayInfo нестандартная.

Автор: MetalFan 16.7.2007, 21:27
Цитата(sw04 @  16.7.2007,  14:44 Найти цитируемый пост)
 while not Terminated  do
  Sleep(5000);

далее этих строк не продвинется выполнение кода, ибо это практически бесконечный цикл есть.

Добавлено @ 21:29
так же не вижу я создания компонента хитрого в пределах потока, а использование созданного вне его не есть мысль благостная

Добавлено @ 21:32
з.ы. так же сказать хочу, что не открывается у меня ссылка, даная автором....

Добавлено @ 21:42
а если серьезно - создай тестовое приложение и приложить не забудь компонент этот чудный.
может на досуге посмотрю

Автор: Virtuals 24.7.2007, 10:08
postmessage(Wn, BM_CLICK,0,0);

без комментариев, у меня все кнопки жмет

Автор: sw04 25.7.2007, 22:31
Цитата(Virtuals @  24.7.2007,  13:08 Найти цитируемый пост)
без комментариев, у меня все кнопки жмет 

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

Автор: Rouse_ 27.7.2007, 11:24
Цитата(sw04 @  25.7.2007,  23:31 Найти цитируемый пост)
иконка не кнопка.

Иконка в трее - это именно кнопка smile Сам трей - не более чем обычный TToolBar. Методы применимые к тулбару будут работать и с системным треем...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)