Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PostMessage срабатывает, а SendMessage нет 
:(
    Опции темы
JustCoder
Дата 1.1.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 1.1.2007

Репутация: нет
Всего: нет



Код библиотеки Tracker.dpr:
Код

library tracker;

uses
  Windows, Messages, Shared;

var
  hKeyBoardHook: THandle = 0;

function KeyBoardHook(nCode, wParam, lParam: Integer): lResult; stdcall;
begin
  if (nCode >= 0) and (GlobalData^.hForm <> 0) then
    //SendMessage(GlobalData^.hForm, WMKeyHook, 0, 0);
    PostMessage(GlobalData^.hForm, WMKeyHook, 0, 0);
  Result:= CallNextHookEx(hKeyBoardHook, nCode, wParam, lParam);
end;

procedure SetHook;
begin
  if hKeyBoardHook = 0 then
    hKeyBoardHook:= SetWindowsHookEx(WH_KEYBOARD, @KeyBoardHook, hInstance, 0);
end;

procedure RemoveHook;
begin
  if hKeyBoardHook <> 0 then
    begin
      UnhookWindowsHookEx(hKeyBoardHook);
      hKeyBoardHook:= 0;
    end;
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: OpenSharedData;
    DLL_PROCESS_DETACH: CloseSharedData;
  end;
end;

exports
  GetDLLData,
  RemoveHook,
  SetHook;

begin
  DllProc:= @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

Код юнита Shared.pas:
Код

unit Shared;

interface

uses
  Windows;

type
  PGlobalDLLData = ^TGlobalDLLData;
  TGlobalDLLData = record
    hForm: HWND;
  end;

const
  MapFileName: PAnsiChar = 'Test';
var
  GlobalData: PGlobalDLLData;
  hMap: THandle;
  SA: TSecurityAttributes;
  WMKeyHook: Integer = 0;

procedure GetDLLData(var PGlobalData: PGlobalDLLData);
procedure OpenSharedData;
procedure CloseSharedData;

implementation

procedure GetDLLData(var PGlobalData: PGlobalDLLData);
begin
  PGlobalData:= GlobalData;
end;

procedure OpenSharedData;
var
  Size: Integer;
begin
  Size:= SizeOf(TGlobalDLLData);
  hMap:= CreateFileMapping(DWord(-1), @SA, PAGE_READWRITE, 0, Size, MapFileName);
  GlobalData:= MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, Size);
  if GlobalData = nil then
    CloseHandle(hMap);
end;

procedure CloseSharedData;
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(hMap);
end;

initialization
  WMKeyHook:= RegisterWindowMessage(MapFileName);
  SA.nLength:= SizeOf(SA);
  SA.bInheritHandle:= True;
  GetMem(SA.lpSecurityDescriptor, SECURITY_DESCRIPTOR_MIN_LENGTH);
  InitializeSecurityDescriptor(SA.lpSecurityDescriptor, 1{SECURITY_DESCRIPTOR_REVISION});
  SetSecurityDescriptorDacl(SA.lpSecurityDescriptor, True, nil, False); //All access
finalization
  FreeMem(SA.lpSecurityDescriptor, SECURITY_DESCRIPTOR_MIN_LENGTH);
end.

Код проекта Project1.dpr: 
Код

unit Unit1;

interface

uses
  Windows, Forms, Shared, Classes, AppEvnts;

type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  
procedure RemoveHook; external 'Tracker.dll';
procedure SetHook; external 'Tracker.dll';
procedure GetDLLData(var AGlobalData: PGlobalDLLData); external 'Tracker.dll';

var
  Form1: TForm1;
  FData: PGlobalDLLData;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetDLLData(FData);
  FData^.hForm:= Handle;
  SetHook;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  RemoveHook;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  if Msg.message = WMKeyHook then
    MessageBox(0, 'KeyBoardHook', 'Test', MB_OK);
end;

end.

Пример демонстрирует извещение основного приложения о срабатывании хука на клаву. Суть проблемы заключается в том, что в фунции хука клавиатуры KeyBoardHook вызов PostMessage срабатывает, а SendMessage нет. Исходники примера прикреплены. Попробуйте изменить SendMessage на PostMessage для проверки эффекта. В чём может быть проблема?

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  HookTest.zip 2,97 Kb
PM MAIL   Вверх
Fin
Дата 1.1.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



SendMessage По идее говоря и не должен работать, если у тебя глобальный хук.   

Это сообщение отредактировал(а) Fin - 1.1.2007, 23:14


--------------------
Пролетал мимо.
PM MAIL   Вверх
anwe
Дата 3.1.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 4
Всего: 23



SendMessage возвращает управление после получения ответа функции, а PostMessage не ждет ответа, то есть сразу выполняется следующая строка твоей программы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.