Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Отследить клик по иконке чужого приложения в трее

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

ktulx



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос, собственно, в названии темы. Возможно ли?
А то я пока ничего лучше не придумал, чем хук на клик по трею вообще, определение координат, снятия скриншота и сравнения его с нужной иконкой

Всего записей: 40 | Зарегистр. 14-07-2013 | Отправлено: 19:48 20-10-2013 | Исправлено: ktulx, 19:48 20-10-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я думаю все глюки с треем из-за таких любопытных. То у меня иконки аськи вообще нет так же как другой аськи, то таск-бар (вин7) ругается что его кто-то вызывает а сам висит.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 10:54 27-10-2013
ktulx



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
Это не я, честное слово.
 
Вообще вот так удаётся получить количество видимых иконок:

Код:
hwd := FindWindow('Shell_TrayWnd', nil);
  hwd := FindWindowEx(hwd, 0, 'TrayNotifyWnd', nil);
  hwd := FindWindowEx(hwd, 0, 'SysPager', nil);
  hwd := FindWindowEx(hwd, 0, 'ToolbarWindow32', nil);
  if hwd <= 0 then Exit;
 
  GetWindowThreadProcessId(hwd, @PID);
  hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, false, PID);
  lpCmn := VirtualAllocEx(hProc, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  Count := SendMessage(hwd, TB_BUTTONCOUNT, 0, 0);

 
А вот здесь что-то не так:

Код:
for i := 0 to Count-1 do
  begin
    ZeroMemory(@btnInfo, sizeof(btnInfo));
    WriteProcessMemory(hProc, lpCmn, @btnInfo, sizeof(btnInfo), buff);
    SendMessage(hwd, TB_GETBUTTON, i, LPARAM(lpCmn));
    ReadProcessMemory(hProc, lpCmn, @btnInfo, sizeof(btnInfo), buff);
    SendMessage(hwd, TB_GETBUTTONTEXT, btnInfo.idCommand, LPARAM(LPARAM(lpCmn) + sizeof(btnInfo)));
    ReadProcessMemory(hProc, Pointer(LPARAM(lpCmn) + sizeof(btnInfo)),@IconCaption, 512, buff);
    ShowMessage(TrayIconCaption);
   end;

Почему-то btnInfo.idCommand всегда равно 4. Явно где-то ошибка. Но я нуб, с памятью особо работать не умею и не понимаю, в чём дело. Выручайте.

Всего записей: 40 | Зарегистр. 14-07-2013 | Отправлено: 14:43 27-10-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
можно получить раздельно все хендлы иконок в трее. в инете полно примеров готовых. мне надо было попуп приделать к иконке легко нагуглил пример
 
Добавлено:
Подробнее...
 
Добавлено:
оказывается коментарии сохранились. по ним найди пример на Си в инете или на чем тебе надо
 
Добавлено:
насколько я помню иконки трея это просто кнопки трея и не важно свое приложение или чужое - кнопки все чужие, они трея

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 15:34 27-10-2013
ktulx



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz
Ох, это ещё и asm. Буду пробовать. Спасибо.
 
Что иконки - кнопки трея, я знаю. А хендлы я получать и пытаюсь, в принципе. Только для начала пробовал получить отдельно инфу о каждой кнопке, и вот какая-то запарка вышла.

Всего записей: 40 | Зарегистр. 14-07-2013 | Отправлено: 17:38 27-10-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
апи функции одинаковые, переделать на Си просто, этот код из как раз Си сделан или из дельфи вообще не помню какой пример нашел
 
Добавлено:
это подрограмма которая выводит попуп возле иконки в трее "своего" приложения. давно сделал теперь всюду приляпываю
 
Добавлено:
     
 
Добавлено:
кстати!!!!!!!!!!!!!!!!!!!!!!
там совсем просто обрабатывается нажатие на иконку своего приложения средствами винды. этот попуп исчезает если в иконку тыкнуть
 
    .ELSEIF uMsg == WM_SHELLNOTIFY
        .IF wParam==IDI_TRAY
            .IF lParam==WM_LBUTTONDBLCLK
 
                mov  eax,offset EXITProc
                invoke CreateThread,NULL,NULL,eax,0,0,addr ThreadID1
                mov ThreadID1, eax
                invoke CloseHandle, ThreadID1
 
то есть если получить хендл просто окна то легко перехватить сообщения трея - потому что все эти нажатия и так окну посылаются. достаточно переватить все сообщения чужого окна и отфильтровать шелнотифаи

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 17:39 27-10-2013 | Исправлено: bomzzz, 17:55 27-10-2013
ktulx



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz
Ты на С пишешь, насколько я понял. А мне ещё нужно этот асмовый код переделать в дельфиновый асм
Но вообще спасибо за наводку. Кое-что стало получаться.

Всего записей: 40 | Зарегистр. 14-07-2013 | Отправлено: 21:17 27-10-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нет это на МАСМ32, переделать в асм дельфи вовсе не надо, для этого тебе придется импортировать все библиотеки в ручную. пиши просто на дельфи и подглядывай какие апи функции вызываются и сообщения обрабатываются

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 00:23 28-10-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Отследить клик по иконке чужого приложения в трее


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru