FreeBasic
Главная
Вход
Регистрация
Суббота, 20.04.2024, 06:49Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » WinAPI » WinApi в freebasic » работа с треем (получение значков из системного трея, и клик по ним)
работа с треем
electrikДата: Пятница, 07.02.2014, 12:50 | Сообщение # 1
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
привет. некоторое время парюсь с одной задачей - програмно кликнуть в трей. ниже дана ссылка на исходники класса обращения к трею, и сам gui, который в listbox'е  отображает список иконок (текстовые натписи).
есть кнопки: двойной левый клик, левый клик, правый клик, отмена.
опишу поведение. всегда кликает правильно на ту иконку, которая реально была выбрана в ручную в трее. есть у меня  своя программа, с простой иконкой в трее, на подобии как у iczelion'а, по такой иконке тоже кликает без ошибочно. в случае с некой иконкой, проявился эффект, если между нажатием и отпусканием  поставил sleep(10), иконка стала выбираться.
в коде есть функция поиска дополнительной панели инструментов переполнения, но пока на нее не смотрите.
поскольку, код еще не совсем рабочий, на страницах форума не публикую, но можно скачать скомпилированный вариант+исходники:
ftp://el-zone.spb.ru/freebasic/tests/systrayicons.rar
компилировать: fbc -s gui systrayicons.rc systrayicons.bas

Добавлено (07.02.2014, 12:50)
---------------------------------------------
всегда кликает правильно на ту иконку, которая реально была выбрана в ручную в трее.
поясню, например, мы нажали на иконку скайпа, а потом из моей программы обращаемся к этой иконке и она уже срабатывает.

 
haavДата: Пятница, 07.02.2014, 15:48 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Сергей! Оно вроде работает, но у меня несколько вопросов:

1) После клика приложение завершается, это необходимо?
2) В windows 7 есть еще скрытые в отдельном окошке иконки, их ты тоже будешь делать?
3) Каково может быть практическое применение данного класса?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Пятница, 07.02.2014, 18:39 | Сообщение # 3
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
да, приложение завершается, ибо иконку выбрали и оно больше не нужно. если конечно, каким-то образом нужно моё окно для исправления глюка, можно завершить чуть позже.  класс применим для программ экранного доступа для незрячих. там есть подобная вещь, но почему-то она иногда глючит. можно значки выбирать с клавиатуры в трее, но иногда, покрайней мере, с программами экранного доступа оно тоже подглючивает.да, панель переполнения тоже хочу заюзать, причем, если она не активна, ее открывать и читать значки в список.
если в семёрках стоит отображать все значки и уведомления на панели задач, проверяю какнибудь панель, переполнения и не трогаю.
далее, есть задумка, перехватывать сообщение Balloon, типа: есть новые обновления, нажмите сдесь. человек такое услышал, ткнул зарание нужную клавишу и вот оно выбрано.
есть комбинация windows+control+b, но пока непойму как оно работает. один человек жаловался, что у него не получалось. возможно виноват  скринридер, может он как-то вмешивается.
и хочу буферизовать балоны, мало ли что-то прослушал.

Добавлено (07.02.2014, 18:39)
---------------------------------------------
можно конечно, поставить скриптовый язык autoit, он на бейсик похож, там на пяти строчках такое делается, но тут уже интерес, winapi и сопротивляющийся мне трей.

 
haavДата: Пятница, 07.02.2014, 19:31 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Понятно, что же будем ждать обновлений.  Когда доведешь до ума, обязательно выложу на основном сайте, может кому будет полезна программа.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Суббота, 08.02.2014, 00:02 | Сообщение # 5
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
постараюсь, для этого я сюда и выложил, может кто-то поймёт как глюк с кликами исправить.
 
haavДата: Суббота, 08.02.2014, 07:12 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Так Сергей поясни мне "на пальцах" где там глюк. А то я два раза перечитал твое первое сообщение, но нифига не понял. При работе проги тоже глюков не встретил

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Воскресенье, 09.02.2014, 00:11 | Сообщение # 7
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
привет. поясняю, программа нормально запускается, и выводит список иконок. когда я в списке выбираю, например, скайп, нажимаю кнопки правый клик или левый клик, то оно не срабатывает.
если я лезу в панель, и мышкой или с клавиатуры выбираю скайп, а потом опять запускаю свою программу и там выбираю скайп, кликаю, и оно срабатывает.
одна проблема уже решена. одиночные клики стали работать.
как я это сделал
устанавливаю курсор в позиции кнопки, и оно работает.
осталась проблема, двойные клики не работают, кнопка западает, и не отпускается. пробовал WM_BUTTONUP, фигня.
как винда делает двойной клик, ходя она его не делает, она ведь окну отправляет, что был двойной клик.
но странно, одиночные ведь работают.

            
Код
function systray.ButtonClick _ ' функция нажатия кнопки в тулбаре
(byval hWnd as HWND, _ ' хэндл панели инструментов
byval nButton as integer, _ ' номер кнопки в панели инструментов - отсчет с нуля
byval click as integer) as BOOL ' имитация клик мышкой
dim bytesread as DWORD
dim tRc as RECT ' координаты окна тулбара
dim rc as RECT ' локальные координаты кнопки
GetWindowRect(hWnd,@tRc) ' получим координаты тулбара относительно экрана
SendMessage(hwnd,TB_GETITEMRECT,nButton,cast(lparam,lpRect)) ' получим локальные координаты кнопки
if ReadProcessMemory(hTbProcess,lpRect,@rc, sizeof(rc),@bytesread) = 0 then ' прочитаем RECT из памяти  
return 0
end if

SetForegroundWindow(hWnd) ' поставим окно тулбара на передний план- это надо, чтоб нормально появлялось контекстное меню  
SetCursorPos(tRc.left+rc.left,tRc.top+rc.top) ' поставим курсор по координатам кнопки
sleep_(70) ' это надо, чтоб успело чтото обновиться в панели, иначе не всегда нормально работает  
select case click
case left_click ' левый клик
SendMessage(hWnd, WM_LBUTTONDOWN,0, MAKELPARAM(rc.left,rc.top)) ' нажмем левую кнопку мыши по координатам rect
SendMessage(hWnd, WM_LBUTTONUP,0,MAKELPARAM(rc.left,rc.top)) ' отпустим левую кнопку мыши
case right_click ' правый клик
SendMessage(hWnd, WM_RBUTTONDOWN,0, MAKELPARAM(rc.left,rc.top)) ' нажмем правую кнопку мыши по координатам rect
SendMessage(hWnd, WM_RBUTTONUP,0,MAKELPARAM(rc.left,rc.top)) ' отпустим правую кнопку мыши
case double_left_click ' двойной левый клик
'SendMessage(hWnd, WM_LBUTTONDBLCLK, 0,MAKELPARAM(rc.left,rc.top)) ' двойной левый клик мыши по координатам rect
case double_right_click ' двойной правый клик
SendMessage(hWnd, WM_RBUTTONDBLCLK, 0,MAKELPARAM(rc.left,rc.top)) ' двойной правый клик мыши по координатам rect

end select
function = 1
end function

Добавлено (09.02.2014, 00:11)
---------------------------------------------
нашел еще одну функцию SendInput

при помощи неё, можно имитировать ввод с клавы и мыши.
попробую у себя ещё одну функцию сделать, именно для клика по координатам при помощиSendInput.
есть ещё функция MouseEvent, она проще, но мелкософты рекомендуют начиная с windows2000 использовать функцию SendInput.

вот такую пакость, только на дельфи и winapi делал человек:
http://tripsin.narod.ru/articles/mouse_imitation/mouse_imitation.htm

 
haavДата: Воскресенье, 09.02.2014, 07:49 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Серега, мы тут с Лехой потестировали твой первый вариант (из первого поста). В общем у меня на win7 такие глюки:

1) Если выбрать любую другую иконку (я выбирал Punto Switcher) , а потом перейти в твою программу и нажать любую другую , но не Punto, то все равно вылезает меню Punto

2) У меня правая кнопка со скайпом вообще не срабатывает ни при каких условиях

У Лехи на windows XP :

1) Появляются лишние пустые строки , то есть программы в списке идут через пробелы:



2) У него кроме вызова нужной программы еще вылезает меню свойств

3) Так же у него пока не нажмешь меню скайпа , твоя прога не завершается.

Я подожду пока ты выложишь свой последний вариант, ведь ты вроде что-то там уже наладил. А потом если еще будут глюки, тогда рассмотрю код и может чем помогу. Кстати MouseEvent отлично работает на семерке, так что если ее использовать проще, не вижу смысла копошиться с SendInput . Плевать что пишут мелкософт, они вон пишут, что DirectDraw устарело и вместо него используйте Direct2D . А у нас FbGFX либа в freebasic по сути обертка DirectDraw
Прикрепления: 1636004.png (9.1 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Воскресенье, 09.02.2014, 08:18 | Сообщение # 9
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Вот видео о глюках Леха записал:

http://video.yandex.ru/users/freebasic/view/2/


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Среда, 12.02.2014, 18:38 | Сообщение # 10
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
опа, пустые строки. значит, надо обрабатывать на скрытые иконки. что-то было у manhunter, проверка, я убрал, вродь в семёрке и восьмёрке проблем не было.
ладно, на работе есть комп с xp, по тестирую.
ну что тогда значат эти скрытые иконки в xp, блин, я то думал что при получении иконок проблем нет. ладно, буду думать.

Добавлено (11.02.2014, 15:54)
---------------------------------------------
короче, можно перекачать вышеприведённый файл. пока фигня. сделал через sendinput. может криво к абсолютным координатам привожу. написал класс для получения разрешения и координат.. убегаю с работы, простите, потом напишу.

Добавлено (12.02.2014, 18:38)
---------------------------------------------
народ, извиняйте. я вчера выложил не рабочий исходник. там пока перемещал строки, удалил очень важную строку. сейчас вродь, работает, но бывает, не всегда. либо чтото с координатами, или даже не знаю что. к клиентским координатам пришлось добавить по +2, так попадал на пустое место панели.пока со второй панелью не мудрил, так как надо с одним разобраться. так же пустые строки возможны, с этим пока не мудрил. двойные клики, тоже отрабатывает. всё будет когда разберёмся с точным попаданием на иконку. пробовал выставлять координаты в центр иконки, вообще ничего не работало. видимо, как-то не правильно расчитываю абсолютные координаты.
вообще странно, я делал так: координата = round(координата экрана * (65535 / разрешение по оси x), тоже и с y.
функцию round написал так:

Код
function round(byval x as double) as longint
function = int(x+0.5)
end function


работает не по компьютерному округлению, когда: 2.9 = 2, а как в школе учили: 2.2 = 2, 2.5 = 3
тестируйте, в коде много комментариев , думаю разберётесь.


Сообщение отредактировал electrik - Среда, 12.02.2014, 18:44
 
haavДата: Четверг, 13.02.2014, 08:05 | Сообщение # 11
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Серега! Ну багов не убавилось. Теперь и у меня на win7 появились пустые строки. Так же я нажал на Punto Switcher сначала двойной клик, потом запустил прогу еще раз и нажал одинарный, но сработало как при двойном клике. Потом еще один баг , иногда нажимаешь какую то иконку, получается что медленно гаснет экран, потом опять включается, что за хрень не знаю, но может эти пустые строки там не зря...

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Четверг, 13.02.2014, 16:49 | Сообщение # 12
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
странно, ведь я не менял алгоритм вытаскивания иконок. значит, чтото скрытое появилось у тебя.
пожалуйста, попробуй посчитай сколько у тебя иконок. последовательность должна быть такаяже как в программе. надо выяснить, пропадают ли иконки в программе.
 блин, может это иконки без текстовых надписей, хотя эт врятли.
ну эт ладно. я уберу пустые строки, но видимо, надо будет учитывать их при выборе из списка. ведь иконка, если даже скрытая, всёравно есть.
а самое главное, что у меня нет такого, чтоб както оттестировать.
блин, эти клики, я уже 100 мс между кликами поставил. с такой скоростью, даже пятилетний не кликает.

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

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

Добавлено (13.02.2014, 16:49)
---------------------------------------------
может экран гаснет из-за GetSystemMetrics?
надо переместить подрубание класса в начало кода.
получаю разрешение экрана вот так:

Код
constructor FBSCREEN()
screenX= GetSystemMetrics(SM_CXSCREEN) ' получим у системы разрешение оси x
screenY= GetSystemMetrics(SM_CYSCREEN) ' получим у системы разрешение оси y
end constructor


а поповоду webvisum, не беспокойся, что спамеры узнают, там рега по приглашению, и ограничение 20  капчей в сутки.
да и злая она у тебя, уже третий раз пытаюсь распознать.
 
haavДата: Четверг, 13.02.2014, 16:53 | Сообщение # 13
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Серега, я убирал капчу уже раньше, видать опять юкоз че то обновил там. Попробуй сейчас,  вроде изменил там что-то похожее. Да вроде сделал что бы пользователи могли фотки загружать

Из-за этого GetSystemMetrics(SM_CXSCREEN) вроде не должно гаснуть, это ведь просто считывает размер дисплея.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Четверг, 13.02.2014, 19:14 | Сообщение # 14
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
да, капча убралась. ну я тут ещё изменения внёс. будет время попробуй. всё-же избавился я от sendinput, переделал на MouseEvent.
интересуют клики.
обязательно, как я и говорил, глянь номера пустых мест в списке, и нет ли в панели под теми же номерами реальных иконок.
блин, а не могут ли это разделители быть. хотя, какие разделители в тулбаре. у фролова были книжки по тулбару, надо почитать, мож действительно есть там чтото.
блин, заморочек будет с этими пустыми местами. хотя, уже придумал!
но всё-же нужно выяснить назначение скрытых иконок, может их нужно врубать...
надо в трей фигни по навешать, может тоже пустоты появятся. у меня в трее около 10 иконок.
 
haavДата: Пятница, 14.02.2014, 06:44 | Сообщение # 15
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Серега! У меня сейчас нет пустых мест. И глюков с кликами я не заметил. То есть все работает так , как задумано. Что касается пустых мест, то это точно не были имеющиеся иконки. Твоя программа и раньше считывала все мои иконки, просто непонятно по каким алгоритмам, она в разных местах размешала пустые строки  и то только после первого запуска программы. При втором запуске пустые строки исчезали.  Но сегодня все хорошо. Я попрошу еще Леху проверить на Windows XP.  Как он сможет, я тебе отпишу.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » WinAPI » WinApi в freebasic » работа с треем (получение значков из системного трея, и клик по ним)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: