Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.09.2016, 10:09
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию GetMenu

Есть древний рабочий пример вызова меню окна
Код:
  NPadHandle := FindWindow(nil, PChar('Безымянный — Блокнот'));
  NPadMenu := GetMenu(NPadHandle);
  NPadSubMenu := GetSubMenu(NPadMenu, 2);
  SendMessage(NPadHandle, WM_COMMAND, GetMenuItemId(NPadSubMenu, 1), 0);
Идем дальше, как я понял меню попапа вызывается точно так же? Заменил
Код:
NPadHandle := Form1.Handle;
NPadMenu:= Popupmenu1.handle;
И никакого выбора.
Пробовал вызвать перед выбором
Код:
PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.y);
Sleep(2000);
Гугл подсказал функцию Выбора (не клика), но даже она не выбирает
Код:
HiliteMenuItem(Form1.Handle, PopupMenu1.Handle, 2, MF_BYPOSITION or MF_HILITE);
Есть у кого опыт с вызовом или подсветкой чужого попапа?

Последний раз редактировалось nixon232, 07.09.2016 в 10:13.
Ответить с цитированием
  #2  
Старый 07.09.2016, 17:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно и посылкой сообщения вызов сделать, не забыв только попапку к форме прикрутить, в смысле Form1.PopupMenu:= PopupMenu1, а дальше
будто бы мыша правой кнопкой отжалась
Код:
sendmessage(Form1.Handle, WM_RBUTTONDOWN, MK_RBUTTON, x + y shl 16);
sendmessage(Form1.Handle, WM_RBUTTONUP, MK_RBUTTON, x + y shl 16);
где x и y - это желаемые координаты показа
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
nixon232 (07.09.2016)
  #3  
Старый 07.09.2016, 17:59
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Сам поппап ввызвать не проблема, хотя способ интересный, может получиться адаптировать под свои нужды, спасибо.. Главный вопрос это выбрать элемент меню без использования клавы/мыши. Такой способ не дает стопроцентный клик, если юзер что-то делает в момент клика и не дай бог попал на попапку, возможен клик в другой пунк. Шанс этого мал, но в моей задаче он критичен.
Ответить с цитированием
  #4  
Старый 07.09.2016, 18:26
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Эмулируют обычно так: сначало блокируют мышу, затем запоминают координаты/состояние курсора, потом собсно сам процесс, в конце возвращают указалку на место и врубают грызуна, юзер испортить такое не успеет, в "чужом" оконце по-другому, без этого, не обойтись
Ответить с цитированием
  #5  
Старый 07.09.2016, 20:09
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Alegun
Эмулируют обычно так: сначало блокируют мышу, затем запоминают координаты/состояние курсора, потом собсно сам процесс, в конце возвращают указалку на место и врубают грызуна, юзер испортить такое не успеет, в "чужом" оконце по-другому, без этого, не обойтись
Сейчас так и делаю, но процеес блокировки толковый не нашел для чужого окна. может подскажите? сейчас использую ShowCursor, Но он бесполезен
Ответить с цитированием
  #6  
Старый 07.09.2016, 20:42
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от nixon232
Сейчас так и делаю, но процеес блокировки толковый не нашел для чужого окна. может подскажите? сейчас использую ShowCursor, Но он бесполезен
вроде решил довольно просто (на первый взгляд) Но нужно тестить.
Код:
procedure BlockInput(fBlockIt : boolean); stdcall; external 'USER32.DLL';
минус только в том, что блочится и клава.
Ответить с цитированием
  #7  
Старый 08.09.2016, 10:56
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

У меня BlockInput не работает, просто никакой реакции, можно ещё прятать курсор и не давать его сдвинуть с нулевых координат, но может объясните задачу более конкретно, что требуется, видимо нужно вызвать попапку чужого окна, выбрать и нажать определённый пункт, а может можно глянуть в ресурсах его номер айди и вызвать по нему, вдруг так проще
Ответить с цитированием
  #8  
Старый 08.09.2016, 20:57
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Alegun
У меня BlockInput не работает, просто никакой реакции, можно ещё прятать курсор и не давать его сдвинуть с нулевых координат, но может объясните задачу более конкретно, что требуется, видимо нужно вызвать попапку чужого окна, выбрать и нажать определённый пункт, а может можно глянуть в ресурсах его номер айди и вызвать по нему, вдруг так проще
У меня Блокируется все, но новость, что оно не везде работает пугает.
Нужно вызвать меню-поп-апа кликнув на обект, который создан как Hud-element на чужом окне. И в этом меню выбрать там нужный элнмент. блокировка нужна для стабильной работы. смещать мышку не желательно.
Про какой Айди идет речь?
Ответить с цитированием
  #9  
Старый 10.09.2016, 10:05
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Alegun
Можно и посылкой сообщения вызов сделать, не забыв только попапку к форме прикрутить, в смысле Form1.PopupMenu:= PopupMenu1, а дальше
будто бы мыша правой кнопкой отжалась
Код:
sendmessage(Form1.Handle, WM_RBUTTONDOWN, MK_RBUTTON, x + y shl 16);
sendmessage(Form1.Handle, WM_RBUTTONUP, MK_RBUTTON, x + y shl 16);
где x и y - это желаемые координаты показа
Попрробовал ваш вариант с небольшими дополнениями, но клика (вызова попапа), нет. в чем может быть проблема?
Код:
SendMessage(h, WM_LBUTTONDOWN, MK_LBUTTON, v.x + v.y shl 16);
       Sleep(100);
    SendtMessage(h, WM_LBUTTONUP, MK_LBUTTON, v.x + v.Y shl 16);
Где V - TPoint, координаты объкта относительно всего стола, h - хендл обекта в точке V, по клику на который, вызывается искомая попапка

Последний раз редактировалось nixon232, 10.09.2016 в 10:18.
Ответить с цитированием
  #10  
Старый 10.09.2016, 23:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Со "своей" попапкой такое действует

Кстати, вспомнилось:
Цитата:
...Любой пункт контекстного меню - это запись в реестре,
там прописано действие, выполняемое при нажатии на этот
пункт. Всё, что вам нужно сделать - это посмотреть на это
действие регедитом и сделать то же самое...

З.Ы. Правда наверное, это верно лишь для эксплорера :-(

З.Ы.З.Ы. К сожалению, это так и оказалось на самом деле, в системный реестр записываются лишь сторонние контекстные команды проводника. А если в корень смотреть, любая попапка программы - это отдельное оконце, со своим хендлом, с обработкой "обычного" меню проблем поэтому и нет, ибо существует несколько десятков функций работы с ним, а для PopUp, при всей их схожести, нужно видимо извращаться, как, явного ответа в тырнете почему-то не нашлось

Последний раз редактировалось Alegun, 11.09.2016 в 10:50.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
nixon232 (11.09.2016)
  #11  
Старый 11.09.2016, 12:26
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

У моей попапки класс #32768. Что за он кстати? судя по всему он не "самопальный". Нашел схожую тему 15-го года в гугле, но там решения так и не нашли, автор там не смог найти хедл. Хендл то есть, а толку )
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter