Форум: "WinAPI";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Внизследить за контекстным меню в другом окне Найти похожие ветки
← →
Альберт (2006-11-22 20:17) [0]Добрый вечер! пытаюсь реализовать программу, которая могла бы следить за конкретным окном (или компонентом :-) ) с целью запрета появления контекстного меню. кажется надо ловить сообщения, но с этим я не работал.. буду рад, если откликнитесь))
← →
Elen © (2006-11-23 08:15) [1]
> Альберт
Почитай про хуки. Думаю надо ловить клики мышки
← →
clickmaker © (2006-11-23 10:27) [2]
> Думаю надо ловить клики мышки
возможно еще shift+f10.
> Альберт (22.11.06 20:17)
А зачем запрещать? Обычно операции в контекстной менюхе дублируются. Кнопками, обычным меню etc
← →
Elen © (2006-11-23 10:48) [3]Знаете господа. самое паршивое что с popup толком нельза работать - сколько рою лит-ру нигде толком не сказаны аспекты и механизмы егонтые
← →
clickmaker © (2006-11-23 11:00) [4]
> [3] Elen © (23.11.06 10:48)
> Знаете господа. самое паршивое что с popup толком нельза
> работать
а с толком - это как?
← →
Elen © (2006-11-23 11:14) [5]
> а с толком - это как?
Гм. Менять на лету, перехватывать вызова процедур из менюшки и много много других Хакерских затейек ;)
← →
clickmaker © (2006-11-23 11:21) [6]
> [5] Elen © (23.11.06 11:14)
>
> > а с толком - это как?
>
> Гм. Менять на лету, перехватывать вызова процедур из менюшки
не понял... а OnPopup и OnClick на что? Или WM_COMMAND
← →
Elen © (2006-11-23 11:33) [7]
> Или WM_COMMAND
Вот-вот только этим и приходится. Разнообразия хочется...
← →
Elen © (2006-11-23 11:35) [8]
> clickmaker
Кстати - вот как ловить мышкино ползанье по попупу?
← →
clickmaker © (2006-11-23 11:45) [9]
> Кстати - вот как ловить мышкино ползанье по попупу?
WM_MENUSELECT
← →
Elen © (2006-11-23 11:52) [10]
> clickmaker
тогда почему не робе такое :по клику на буттон вылазит попуп...
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if msg.message=WM_MENUSELECT then caption:="sd";
end
как ловить этот месседж? хуком?
← →
clickmaker © (2006-11-23 12:04) [11]
> [10] Elen © (23.11.06 11:52)
потому что сообщение приходит окну, породившему меню
← →
Elen © (2006-11-23 12:26) [12]
> потому что сообщение приходит окну, породившему меню
Тоесть форме? А точнее? Так вот не выходит :unit Unit1;
...
interface
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N11: TMenuItem;
N21: TMenuItem;
Button1: TButton;
procedure qq(var m:TWMMenuSelect); message WM_MENUSELECT ;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure tform1.qq;
begin
form1.caption:="sd";
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PopupMenu1.Popup(500,100);
end;
end.
Какое окно породило меню в случае его вызова по клику на кнопке?
← →
clickmaker © (2006-11-23 12:30) [13]
> [12] Elen © (23.11.06 12:26)
нет, не форме. VCL создает спец окно класса TPUtilWindow. Ему все и приходит. Сначала WM_ENTERMENULOOP, потом WM_MENUSELECT, WM_COMMAND, а потом WM_EXITMENULOOP
← →
Elen © (2006-11-23 12:48) [14]
> clickmaker
И как отловить или перебить месаги для TPUtilWindow?
← →
clickmaker © (2006-11-23 12:58) [15]глобальная переменная PopupList
← →
Elen © (2006-11-23 13:03) [16]
> clickmaker
Ха. Так это для моей проги. А как это проделать в чужой. Рассказываю ситуэйшн - есть одна прога у наших конструкторов (ужость) там выползает меню с подменю с подменю с подменю по нажатии на кнопку. Так вот уж очень долго по этим подменю лазить мышкой с шариком, спотыкается постоянно. Вот и захотелось написать ченить типа эмулятора нажатия на пункт попупа, но как послать мессагу тому что не имеет хенделя. В общем TPUtilWindow теперь я конечно попробую, но...
← →
clickmaker © (2006-11-23 13:07) [17]
> эмулятора нажатия на пункт попупа, но как послать мессагу
> тому что не имеет хенделя
а прога на дельфи что-ли?
← →
Elen © (2006-11-23 13:11) [18]
> clickmaker
Чужая? Ага .
← →
Альберт (2006-11-23 16:58) [19]а глобальный хук надо делать только в dll чтоли?
← →
Альберт (2006-11-23 21:26) [20]еще вопрос. при перечислении дочерних окон окна браузера не видно окно Flash-компонента.
← →
Elen © (2006-11-24 07:50) [21]
> при перечислении дочерних окон окна браузера не видно окно
> Flash-компонента
Ловиш менюху в ролике flash? Тяжко будет...
Верный способ получения хенделей запустить spy++ из стандартной поставки Visual Studio и посмотреть в нем какие хендели есть у браузера. Может у того что ты ловиш хенделя нет - flash ролик это ж рисунок
← →
Альберт (2006-11-25 12:55) [22]спасибо за совет!
поймал ее (менюху)!!! ))) Flash - это окно.
а отмена передачи сообщения этому окну как сделать?
← →
Leonid Troyanovsky © (2006-11-25 13:04) [23]
> Альберт (25.11.06 12:55) [22]
> а отмена передачи сообщения этому окну как сделать?
Если сообщение было PostMessage, то, например, хуком
WH_GETMESSAGE.
Если оно было SendMessage, то сабклассируя окно.
Т.е., из того же хука, назначить окну путем
SetWindowLong новую оконную процедуру.
--
Regards, LVT.
← →
Альберт (2006-11-25 13:16) [24]делаю через WH_GETMESSAGE.
обрабатываю так:
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
begin
// ...........................
end;
но правый клик все равно работает на том окне..
← →
Leonid Troyanovsky © (2006-11-25 13:39) [25]
> Альберт (25.11.06 13:16) [24]
> делаю через WH_GETMESSAGE.
..
> но правый клик все равно работает на том окне..
Отменить обработку сообщения полностью нельзя.
Однако, можно модифицировать его в нечто нейтральное,
например, в WM_NULL.
--
Regards, LVT.
← →
Альберт (2006-11-25 13:45) [26]а каким образом можно модифицировать его? sendmessage?
очень хотелось бы пример кода..
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
begin
// ...........................
end;
я так понимаю на месте комментария должно что-то стоять..
← →
Leonid Troyanovsky © (2006-11-25 13:52) [27]
> Альберт (25.11.06 13:45) [26]
> я так понимаю на месте комментария должно что-то стоять.
Конечно. Что-то вроде
TMsg(lParam).message := WM_NULL
--
Regards, LVT.
← →
Leonid Troyanovsky © (2006-11-25 13:57) [28]
> Leonid Troyanovsky © (25.11.06 13:52) [27]
> TMsg(lParam).message := WM_NULL
PMsg(lparam).Message
--
Regards, LVT.
← →
Альберт (2006-11-25 14:03) [29]получилось!)) теперь флешки без контекстного работают. спасибо большое!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.034 c