Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.01.2013, 22:32
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
По умолчанию Проблема с hook-ом на события мыши

Суть проблемы в следующем: ловушка на
щелчки мыши, встроенная в тело исполняемой
пр-мы(не dll), полностью перестает
обрабатывать сообщения стоит только
отправить машину в ждущий, спящий режимы.
То есть она просто остается болтаться в
процессах, не выполняя никакой полезной
работы. Ошибка в результате внесенных мною
в код изменений исключается, т.к. пробовал
запускать чистый hook с единственной
сигнализацией в виде диалог. сообщения - итог
тот же. Можно ли исправить это поведение
программы? Если же это принципиально невозможно, то может быть есть способ отслеживать возвращение из спящего, ждущего и прочих режимов и перезапускать процесс самостоятельно(остается надеятся, что это крайний случай). Буду благодарен ответившим.
Ответить с цитированием
  #2  
Старый 30.01.2013, 08:55
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ловушка application-defined или library-defined? hMod и dwThreadId какие?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 30.01.2013, 08:59
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
По умолчанию

Да, ловушка прописана в exe-шнике
__________________
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может.
Ответить с цитированием
  #4  
Старый 30.01.2013, 09:12
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
По умолчанию

hMOD и, насколько я могу судить - идентификатор процесса отсутствуют)) Я полный дилетант в библиотеках, собственно, в первый раз за нее и взялся, и почему-то не нашел им места в своем незамысловатом творении.. Так то все работает прекрасно, но лишь до тех пор, пока не машина не уходит в энергосберегающий режим.
__________________
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может.
Ответить с цитированием
  #5  
Старый 30.01.2013, 09:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

переделай в dll
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 01.02.2013, 03:11
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
Вопрос

Цитата:
Сообщение от NumLock
переделай в dll

Переделал. Теперь такая оказия:
баги начинают плодиться именно на выгрузке, но с условием, что не было закрыто хотя бы одно из чужих окон, куда был произведен правый щелчок мыши.

Вот, собственно, сам модуль 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  
Старый 01.02.2013, 03:20
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Посмотри, может что и пригодится.
Вложения
Тип файла: rar crack.rar (30.5 Кбайт, 33 просмотров)
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 01.02.2013, 04:02
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
По умолчанию

angvelem: Это круто, спасибо. Законченная, а главная полезная програмка. Когда то делал для себя что-то подобное, но это
вкуснее будет! Тем не менее, загвоздка, насколько я теперь могу судить, в другом.. А именно в popupmenu. Попробовал подставить вместо него showmessage() и все заработало как надо, никакого каскада багов. Но вот заменять popup на что-то другое не хотелось бы, вроде как на нем все и зыждется.. Пробовал выставлять у него владельцем и application и nil и form1, но исход одинаков - вырубаешь dll раньше обработанных окон и летит все к черту..
__________________
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может.
Ответить с цитированием
  #9  
Старый 01.02.2013, 04:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я бы на твоём месте писал на 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;
идёт постоянное создание нового меню без его последующего уничтожения. Создай его в секции initialization, а в finalization уничтожай.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Inkognito (01.02.2013)
  #10  
Старый 01.02.2013, 04:32
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от angvelem
Идёт постоянное создание нового меню без его последующего уничтожения. Создай его в секции initialization, а в finalization уничтожай.
Пробовал, бесполезно, не играет роли. Все равно спасибо за участие, а главное программу! ))
__________________
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может.
Ответить с цитированием
  #11  
Старый 01.02.2013, 04:35
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну так и перепиши вызов меню на WinAPI, совсе не сложно. Ещё проще, если оно будет создано в ресурсном файле.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #12  
Старый 01.02.2013, 04:56
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
По умолчанию

Придется..
__________________
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025