![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Посмотри, может что и пригодится.
|
|
#8
|
|||
|
|||
|
angvelem: Это круто, спасибо. Законченная, а главная полезная програмка. Когда то делал для себя что-то подобное, но это
вкуснее будет! Тем не менее, загвоздка, насколько я теперь могу судить, в другом.. А именно в popupmenu. Попробовал подставить вместо него showmessage() и все заработало как надо, никакого каскада багов. Но вот заменять popup на что-то другое не хотелось бы, вроде как на нем все и зыждется.. Пробовал выставлять у него владельцем и application и nil и form1, но исход одинаков - вырубаешь dll раньше обработанных окон и летит все к черту.. ![]() |
|
#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; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Inkognito (01.02.2013)
| ||
|
#10
|
|||
|
|||
|
Цитата:
|
|
#11
|
||||
|
||||
|
Ну так и перепиши вызов меню на WinAPI, совсе не сложно. Ещё проще, если оно будет создано в ресурсном файле.
|
|
#12
|
|||
|
|||
|
Придется..
|