Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2012, 20:04   #1
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию передача сообщения из DLL

Здравствуйте форумчане!
Такой вопрос у меня: Набросал хук на мышь где отлавливаю нажатие на клавиши и движение курсора. С этой частью нормально. А как мне всё это безобразие передавать в приложение, чтобы в дальнейшем уже приложение обрабатовало действия. Пока на ум пришло только пересылка с помощью SendMessage, т.е хуком отловили сообщение например WM_LBUTTONUP и это же сообщение переслали в приложение. Или просто как нибудь передать параметр, например 1 это WM_LBUTTONUP 2 это WM_LBUTTONDOWN и т.д.
Так ли я мыслю или это делается по другому. Больше года уже не писал в делфи, практически все тонкости забыл
SERG1980 вне форума Ответить с цитированием
Старый 28.11.2012, 20:49   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
postMessage(findWindow(nil, 'MY APPLICATION'), WM_USER + 1, mouseInfo.pt.X, mouseInfo.pt.Y);
Ловим как обычно:
Код:
private
    { Private declarations }
    procedure wmUser1(var msg: tMessage); message WM_USER + 1;
...


procedure Tmain_wnd.wmUser1(var msg: tMessage);
begin
 memo1.lines.add( 
 format('v1: %d; v2: %d;', [msg.WParam, msg.LParam])
)
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.11.2012, 09:12   #3
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Сделал но сообщения о нажатой кнопки мыши передаются в программу только когда курсор находится над ней. если кликать за пределами окна то ничего не происходит.
SERG1980 вне форума Ответить с цитированием
Старый 29.11.2012, 09:25   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Набросал хук на мышь где отлавливаю нажатие на клавиши и движение курсора.
В какое приложение? У тебя Хук висит, либо ты передаешь по цепочке сообщение через CallNextHookEx дальше адресату, либо получаешь рекурсию с сообщениями. Возможно бесконечную.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.11.2012, 10:28   #5
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Вот исходник Dll
Код:
{$R *.res}
uses
  SysUtils,
  Classes,
  Windows,
  Messages;

var HMouse: hHook = 0;
    WindowHd: THandle;
function Key_HookMouse(code,wP,lP:integer):integer stdcall;
begin
 if (code >=0) then
  begin
   if wP = WM_LBUTTONDOWN then SendMessage(WindowHd,WM_USER + 1,wP,lP);
  end;
 Result:=CallNextHookEx(HMouse,code,wP,lP);
end;

procedure StartMouse;
begin
WindowHd:=FindWindow(nil,'Form1');
if HMouse = 0 then HMouse:=SetWindowsHookEx(WH_MOUSE,@Key_HookMouse,hinstance,0);

end;

procedure StopMouse;
begin
 if HMouse <> 0 then
  begin
   UnhookWindowsHookEx(HMouse);
   HMouse:=0;
  end;
end;

exports
 StartMouse,
 StopMouse;

begin
end.
а вот приложение в которое должны приходить все сообщения о нажатии клавиши на мышке
Код:
 public
     procedure WMMouseInfo(var msg: TMessage); message WM_USER + 1;
  end;

var
  Form1: TForm1;
 procedure StartMouse; stdcall;
 procedure StopMouse; stdcall;
implementation

{$R *.dfm}
procedure StartMouse; external 'xxxxxx.dll' name 'StartMouse';
procedure StopMouse; external 'xxxxxx.dll' name 'StopMouse';

procedure TForm1.WMMouseInfo(var msg: TMessage);
begin
 if msg.WParam = WM_LBUTTONDOWN then memo1.Lines.Add('down')
 else inherited;
end;
SERG1980 вне форума Ответить с цитированием
Старый 29.11.2012, 10:56   #6
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

DLL не нужна вообще.
Для глобального перехвата мышиных событий существует хук WH_LL_MOUSE.
xoodoo вне форума Ответить с цитированием
Старый 29.11.2012, 11:24   #7
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
DLL не нужна вообще.
Для глобального перехвата мышиных событий существует хук WH_LL_MOUSE.
Да получилось (WH_MOUSE_LL = 14) а почему не получается через WH_MOUSE?

Последний раз редактировалось SERG1980; 29.11.2012 в 11:33.
SERG1980 вне форума Ответить с цитированием
Старый 29.11.2012, 13:35   #8
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

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

В том экземпляре, который ты загрузил ручками с целью вызова StartMouse, переменная WindowHd была инициализирована значением хендла искомого окна.
Во всех прочих потенциально загружаемых системой экземплярах никто эту процедуру не вызывал, поэтому WindowHd в них не инициализирована.
xoodoo вне форума Ответить с цитированием
Старый 29.11.2012, 14:58   #9
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Ну хорошо а вы можете мне показать на примере как сделать без DLL хук на мышь с помощью WH_LL_MOUSE
SERG1980 вне форума Ответить с цитированием
Старый 29.11.2012, 15:08   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...вечером скину такой прожект, машина на работе голяк.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача сообщения в порядке очереди g-davicelli Работа с сетью в Delphi 1 07.11.2011 05:38
Передача сообщения программе Anfall Общие вопросы Delphi 13 13.08.2011 13:29
прием передача сообщения от сервера клиенту и на оборот Lokos Работа с сетью в Delphi 4 24.08.2010 18:24
Передача сообщения о нажатии клавиши в DOSBox Gerzs Общие вопросы Delphi 3 15.11.2009 19:02
Передача сообщения из программы в свою Dll SergeySK Общие вопросы Delphi 3 01.11.2007 14:42