Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1174908858
lobach
2007-03-26 15:34
2007.04.15
Как прочитать строку???


9-1145892476
grisme
2006-04-24 19:27
2007.04.15
Помогите с моделями.


2-1174678650
Селезин
2007-03-23 22:37
2007.04.15
Разделитель целой и дробной части числа


2-1175052215
bagos
2007-03-28 07:23
2007.04.15
drag drop формы


9-1146880328
Сценарист
2006-05-06 05:52
2007.04.15
Что случилось с CVS ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский