Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

следить за контекстным меню в другом окне   Найти похожие ветки 

 
Альберт   (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 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
15-1174389112
ocean
2007-03-20 14:11
2007.04.15
Чем отличается Vista Ultimate от Business и Home Premuim?


11-1143026595
Unknown Mystic
2006-03-22 14:23
2007.04.15
Задание StateImage для эл-тов TKOLTreeView при создании формы.


6-1161713578
Amt2001
2006-10-24 22:12
2007.04.15
Indy FTPServer и потоки


2-1174914935
VitAngel
2007-03-26 17:15
2007.04.15
Вопрос по CopyFile


2-1174895020
IgorMish
2007-03-26 11:43
2007.04.15
Строка в CheckBox