
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Сообщ.
#1
,
|
|
|
Имеет место быть контрол, хочется щелкать мышью где угодно и обрабатывать сообщение.
Пока, полазив по этому форуму, реализовал только так: ![]() ![]() switch(Message.Msg) { case WM_LBUTTONDOWN: { SetCapture(Handle); break; } case WM_LBUTTONUP: { ReleaseCapture(); //нужные действия } } Работает оно довольно криво - то есть нужно на контроле зажать мышку, и отпустить там где надо. Как-нибудь можно сделать чтоб без особых премудростей можно было щелкать?.. П.С. пишу на сибилдере. |
Сообщ.
#2
,
|
|
|
Может подумать о Хуках если нужны сообщения чужих окон?
|
Сообщ.
#3
,
|
|
|
Так все страшно?.. Ладно, тогда совершенно нубская просьба - а не подскажете ли где можно почитать про хуки? =)
|
Сообщ.
#4
,
|
|
|
Незнаю. Давно не читал. Но думаю можно поискать яндексом по сайту RSDN.ru
возможно и на этом |
Сообщ.
#5
,
|
|
|
Ясно, спасибо =)
|
![]() |
Сообщ.
#6
,
|
|
Цитата LightRevan @ Работает оно довольно криво а в чем кривизна проявляется? может кривизна в коде? |
Сообщ.
#7
,
|
|
|
Код я привел, о кривизне-то сам судить не могу =) Если в чем туплю - поправьте, затем сюда и пишу.
Кривизна проявляется в том что сообщение получаю исключительно если левая кнопка была зажата на моем окне, а отпущена уже где-то вне. Если SetCapture пользовать не по WM_LBUTTONDOWN, то результат точно такой же - не ловит сообщение, если я просто щелкаю мышью вне окна. |
Сообщ.
#8
,
|
|
|
А как твоим кодом обрабатываются не нужные тебе сообщения? Надеюсь, ты их отправляешь далее по цепочке? Из представленного кода не видно.
|
Сообщ.
#9
,
|
|
|
Полный код процедуры обработки сообщений, во избежание:
![]() ![]() void __fastcall TForm1::WndProc(TMessage &Message) { switch(Message.Msg) { case WM_LBUTTONDOWN: { SetCapture(Handle); break; } case WM_LBUTTONUP: { ReleaseCapture(); //нужные действия } } TForm::WndProc(Message); }; Если убрать пересылку то оно вообще обижается на этапе компиляции. |
Сообщ.
#10
,
|
|
|
Я помнится давным давно пользовал Spy++ визуальной студии. Смотрел, куда какие сообщения идут. Может в твоей среде есть нечно подобное?
|
Сообщ.
#11
,
|
|
|
Вроде как нету, ну да не суть - судя по мануалам, в стандартном случае сообщение отправляется тому окну на котором был клик. Пожалуй что действительно надо в хуках копаться...
|
Сообщ.
#12
,
|
|
|
Цитата LightRevan @ исключительно если левая кнопка была зажата на моем окне а чего ты хотел? откуда твое окно узнает о том, что где-то там(вне его самого) была нажата кнопка мыши? если не секрет, зачем все это надо? что пишешь? |
Сообщ.
#13
,
|
|
|
Цитата miksayer @ а чего ты хотел? откуда твое окно узнает о том, что где-то там(вне его самого) была нажата кнопка мыши? Да вот как раз чтоб это самое и узнавало =) А чтоб узнать откуда тут и спрашиваю)) Цитата miksayer @ если не секрет, зачем все это надо? Ох, если честно - самостоятельно, на практике, пытаюсь осваивать WinApi. Конкретно сейчас хочу чтоб из моего приложения можно было писать текст в Edit другого, какого захочется, окна. Раз уж с мышкой не получается, то тогда, думаю, надо искать хэндл окна по имени, а дальше в его дочерних хэндл эдита, и ему уже посылать WM_SETTEXT. |
![]() |
Сообщ.
#14
,
|
|
Цитата LightRevan @ Работает оно довольно криво - то есть нужно на контроле зажать мышку, и отпустить там где надо. приведенный в 1м посте код должен работать при условии если это код функции обработки сообщения контрола, за который надо уцепиться. если с произвольным контролом такое делать то тебе поможет SetWindowsHookEx+WH_MOUSE_LL пример можно глянуть здесь (Hook.cpp) |
Сообщ.
#15
,
|
|
|
ElcnU, спасибо.
Вопрос окончательно прояснен, пойду изучать предметную область дальше =) |