Сейчас на форуме: tyns777, zds, JustLife, 2nd (+4 невидимых)

 eXeL@B —› Программирование —› Click on tray icon
Посл.ответ Сообщение

Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 07 мая 2009 10:00
· Личное сообщение · #1

Привет всем, как можно програмно кликнуть на иконке в трее? Если можно покажите пример.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 07 мая 2009 10:13 · Поправил: Jupiter
· Личное сообщение · #2

сначала находишь хэндл окна через FindWindow, а потом:

Code:
  1. uMsg:
  2. WM_SHELLNOTIFY
  3. |
  4. wParam:
  5. IDN_TRAY
  6. |
  7. lParam:
  8. WM_RBUTTONDOWN
  9. |
  10. или
  11. lParam:
  12. WM_LBUTTONDBLCLK


P.S. нашёл баг в тэге кода: если в коде есть два переноса строки подряд - то номер пустой строки выводится поверх номера предыдущей

-----
EnJoy!




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 07 мая 2009 10:23
· Личное сообщение · #3

ewgeny1987
Если пишешь тулзу для автоматизации чего-то, то вспомни об AutoIt

-----
My love is very cool girl.




Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 07 мая 2009 15:29
· Личное сообщение · #4

Спасибо Jupiter.



Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 08 мая 2009 08:22 · Поправил: ewgeny1987
· Личное сообщение · #5

Может я чегото не понял но что есть IDN_TRAY? Я не могу его нигде найти, чему это равно?



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 08 мая 2009 17:37 · Поправил: Stack
· Личное сообщение · #6

ewgeny1987, типа окну которое управляет этой иконой посылаешь - вот тока сообщения могут быть разные (так Сказать WM_USER + X)

Смотри то что нужно в хелпе по мастаевскому тулбару.

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 08 мая 2009 18:04
· Личное сообщение · #7

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

приложение заполняет структуру NOTIFYICONDATA
тебе нужно узнать значение uID этой структуры
подсмотреть его можно перед вызовом Shell_NotifyIcon с параметром NIM_ADD

в моём предыдущем примере IDN_TRAY - это uID, который может быть любым (даже 0) и задаётся программистом приложения

-----
EnJoy!





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 08 мая 2009 18:16
· Личное сообщение · #8

Stack пишет:
так Сказать WM_USER + X


uID может быть любым и совсем не обязательно больше WM_USER

WM_USER+5 - это WM_SHELLNOTIFY (с этим у ТС проблем не возникло)

Stack пишет:
Смотри то что нужно в хелпе по мастаевскому тулбару


при чём тут тулбар?

инфа про трэй:

WASM СТАТЬИ > Уроки Iczelion'а Win32 API. Урок 23. Иконка в system tray

-----
EnJoy!





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 08 мая 2009 18:29
· Личное сообщение · #9



4bf5_08.05.2009_CRACKLAB.rU.tgz - Tray_Icon_Example_XR.zip

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 09 мая 2009 12:15
· Личное сообщение · #10

Jupiter пишет:
WM_USER+5 - это WM_SHELLNOTIFY (с этим у ТС проблем не возникло)


C таким же успехом можно и WM_USER + 10 поставить - проще отладить и найти нужные параметры в самой проге.


Jupiter пишет:
при чём тут тулбар?

Spy++ говорит что класс области икон в трее - ToolbarWindow32. Соответственно можно и эмулировать клик даже по иконке незнакомой проги.

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 10 мая 2009 10:53 · Поправил: ewgeny1987
· Личное сообщение · #11

В общем хендл иконки я нахожу ( FindWindow), а вот послать нужные параметры с помощью PostMessage чтобы сэмулировать правый клик не могу.

WM_SHELLNOTIFY equ WM_USER+5

...
invoke FindWindow,addr tClass,addr tText

invoke PostMessage,eax,WM_SHELLNOTIFY ,?,?



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 10 мая 2009 11:55
· Личное сообщение · #12

ewgeny1987
Добавь интерактива в прогу программно подведи к иконке курсор и, также программно, сделай клик мышкой




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 11 мая 2009 00:07
· Личное сообщение · #13

Stack пишет:
C таким же успехом можно и WM_USER + 10 поставить - проще отладить и найти нужные параметры в самой проге.


я об этом написал в посте #7

Jupiter пишет:
тебе нужно узнать значение uID этой структуры
подсмотреть его можно перед вызовом Shell_NotifyIcon с параметром NIM_ADD


-----
EnJoy!




Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 13 мая 2009 07:15
· Личное сообщение · #14

tihiy_grom а если иконка окажится в другом месте чем в прошлый раз то как быть? Ведь в трее все меняется от раза к разу.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 13 мая 2009 10:41
· Личное сообщение · #15

ewgeny1987 пишет:
tihiy_grom а если иконка окажится в другом месте чем в прошлый раз то как быть?


похоже, что ты избрал ректальный метод

повторю ещё раз простейший алго:

1. Открываешь прогу в дизассемблере
2. Находишь ссылку на Shell_NotifyIcon
3. Определяешь uID структуры NOTIFYICONDATA, это и будет IDN_TRAY
4. С помощью FindWindow находишь хэндл окна проги (hWnd)
5. При помощи SendMessage посылаешь сообщение окну:

Code:
  1. invoke SendMessage,hWnd,WM_SHELLNOTIFY,IDN_TRAY,WM_LBUTTONDBLCLK

если нужно вызвать меню:
Code:
  1. invoke SendMessage,hWnd,WM_SHELLNOTIFY,IDN_TRAY,WM_RBUTTONDOWN


всё. никаких запар по поводу "в трее все меняется от раза к разу"

P.S. всё это я уже говорил в предыдущих сообщениях, просто пробуй хоть что-то - если бы ты попытался реализовать - давно бы уже сделал

-----
EnJoy!




Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 14 мая 2009 04:30
· Личное сообщение · #16

Вроде все понял кроме точного значения WM_SHELLNOTIFY, оно же определяется програмистом. Как его найти?




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 14 мая 2009 07:16
· Личное сообщение · #17

ewgeny1987 пишет:

Вроде все понял


нихрена ты не понял
ты ленив и бестолков
толковый человек, задав вопрос и получив ответ, приступает к решению задачи, но это не про тебя.
ты ждёшь, пока за тебя сделают всё другие
у тебя есть всё для решения поставленной задачи: описание алгоритма действий, пример работы с треем, описание констант, но ты ничего не сделал сам!


я погорячился, сказав, что у тя не возникло проблем с WM_SHELLNOTIFY в посте #8:
Jupiter пишет:
WM_USER+5 - это WM_SHELLNOTIFY (с этим у ТС проблем не возникло)



твои слова "все понял кроме точного значения WM_SHELLNOTIFY" означают, что ты даже не разбирался

итог:
WM_SHELLNOTIFY = WM_USER+5

просьба к модераторам: закройте топик, вся необходимая инфа у ТС есть

-----
EnJoy!




Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 14 мая 2009 07:51
· Личное сообщение · #18

Извините за бестолковые вопросы но я подставлял WM_SHELLNOTIFY equ WM_USER+5, програмист мог определить его по другому.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 14 мая 2009 08:42
· Личное сообщение · #19

если бы ты не поленился и осилил мой пост #15, то уже давно бы увидел в дизассемблере, с какими параметрами вызывается Shell_NotifyIcon

Code:
  1. BOOL Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA lpdata);


dwMessage будет NIM_ADD (константа)

второй параметр - указатель на структуру NOTIFYICONDATA, в которой тебя интересуют uID и uCallbackMessage:

Code:
  1. typedef struct _NOTIFYICONDATA {
  2.     DWORD cbSize;
  3.     HWND hWnd;
  4.     UINT uID;
  5.     UINT uFlags;
  6.     UINT uCallbackMessage;
  7.     HICON hIcon;
  8.     TCHAR szTip[64];
  9.     DWORD dwState;
  10.     DWORD dwStateMask;
  11.     TCHAR szInfo[256];
  12.     union {
  13.         UINT uTimeout;
  14.         UINT uVersion;
  15.     };
  16.     TCHAR szInfoTitle[64];
  17.     DWORD dwInfoFlags;
  18.     GUID guidItem;
  19.     HICON hBalloonIcon;
  20. } NOTIFYICONDATA, *PNOTIFYICONDATA;


-----
EnJoy!




Ранг: 10.6 (новичок)
Активность: 0=0
Статус: Участник

Создано: 14 мая 2009 09:30 · Поправил: ewgeny1987
· Личное сообщение · #20

Спасибо всем за ответы и участье особенно тебе Jupiter , наконец то я разобрался. Вот мой рабочий код код для клика на трей иконке:

invoke FindWindow,addr tClass,addr tText

mov whandle,eax

mov sn,24581; Значение для WM_SHELLNOTIFY естественно для другой программы не пойдет
invoke SendMessage,whandle,sn,0,WM_LBUTTONDOWN

invoke SendMessage,whandle,sn,0,WM_LBUTTONUP




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 14 мая 2009 09:53
· Личное сообщение · #21

как вариант:
Code:
  1. IDN_TRAY equ 0
  2. WM_SHELLNOTIFY equ 6005h
  3. invoke SendMessage,hWnd,WM_SHELLNOTIFY,IDN_TRAY,WM_LBUTTONDBLCLK


-----
EnJoy!



 eXeL@B —› Программирование —› Click on tray icon
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати