![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Суть проблемы в следующем: ловушка на
щелчки мыши, встроенная в тело исполняемой пр-мы(не dll), полностью перестает обрабатывать сообщения стоит только отправить машину в ждущий, спящий режимы. То есть она просто остается болтаться в процессах, не выполняя никакой полезной работы. Ошибка в результате внесенных мною в код изменений исключается, т.к. пробовал запускать чистый hook с единственной сигнализацией в виде диалог. сообщения - итог тот же. Можно ли исправить это поведение программы? Если же это принципиально невозможно, то может быть есть способ отслеживать возвращение из спящего, ждущего и прочих режимов и перезапускать процесс самостоятельно(остается надеятся, что это крайний случай). Буду благодарен ответившим. |
#2
|
||||
|
||||
![]() ловушка application-defined или library-defined? hMod и dwThreadId какие?
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() Да, ловушка прописана в exe-шнике
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может. |
#4
|
|||
|
|||
![]() hMOD и, насколько я могу судить - идентификатор процесса отсутствуют)) Я полный дилетант в библиотеках, собственно, в первый раз за нее и взялся, и почему-то не нашел им места в своем незамысловатом творении.. Так то все работает прекрасно, но лишь до тех пор, пока не машина не уходит в энергосберегающий режим.
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может. |
#5
|
||||
|
||||
![]() переделай в dll
Пишу программы за еду. __________________ |
#6
|
|||
|
|||
![]() Цитата:
Переделал. Теперь такая оказия: баги начинают плодиться именно на выгрузке, но с условием, что не было закрыто хотя бы одно из чужих окон, куда был произведен правый щелчок мыши. Вот, собственно, сам модуль dll. Подсказали, что проблема в финализации, но ума не приложу какая финализация здесь требуется, кроме разве что высвобождения единственного popupmenu.. Код:
library lib2; uses forms, menus, windows, dialogs, messages, controls, Unit1 in 'Unit1.pas' {Form1}; type TFm = class(TForm) procedure x1Click(Sender: TObject); end; var pt : TPoint; theHook : THandle; fm:TFm; popupmenu1:tpopupmenu; procedure TFm.x1Click(Sender: TObject); begin showmessage('#') end; procedure DLLProc_(Reason: Integer); var i:integer; begin if Reason = DLL_PROCESS_DETACH then {popupmenu1.free} end; function MouseHook(nCode, wParam, lParam : integer) : Lresult; stdcall; Begin case wParam of WM_RBUTTONUP : begin popupmenu1 := tpopupmenu.create(application); with popupmenu1.items do add(newitem('click',0,False,True,fm.x1Click,0,'MenuItem1')); popupmenu1.popup(mouse.cursorpos.x,mouse.cursorpos.y); end else Result := CallNextHookEx(theHook, nCode, wParam, lParam); end; End; procedure Start; begin theHook := SetWindowsHookEx(wh_mouse, @mouseHook, hInstance, 0); if theHook = 0 then messageBox(0,'Error!','Error!',mb_ok); end; procedure Remove; begin UnhookWindowsHookEx(theHook); end; exports Start index 1 name 'Start', Remove index 2 name 'Remove'; begin DLLProc:= @DLLProc_; end. Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может. |
#7
|
||||
|
||||
![]() Посмотри, может что и пригодится.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
|||
|
|||
![]() angvelem: Это круто, спасибо. Законченная, а главная полезная програмка. Когда то делал для себя что-то подобное, но это
вкуснее будет! ![]() ![]() Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может. |
#9
|
||||
|
||||
![]() Я бы на твоём месте писал на WinAPI, пробем меньше будет.
По поводу меню: Код:
function MouseHook(nCode, wParam, lParam : integer) : Lresult; stdcall; begin case wParam of WM_RBUTTONUP : begin popupmenu1 := tpopupmenu.create(application); with popupmenu1.items do add(newitem('click', 0, False, True, fm.x1Click, 0, 'MenuItem1')); popupmenu1.popup(mouse.cursorpos.x, mouse.cursorpos.y); end else Result := CallNextHookEx(theHook, nCode, wParam, lParam); end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Inkognito (01.02.2013)
|
#10
|
|||
|
|||
![]() Цитата:
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может. |
#11
|
||||
|
||||
![]() Ну так и перепиши вызов меню на WinAPI, совсе не сложно. Ещё проще, если оно будет создано в ресурсном файле.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#12
|
|||
|
|||
![]() Придется..
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может. |