AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mousehook

Ein Thema von hanspeter · begonnen am 28. Mär 2012 · letzter Beitrag vom 16. Apr 2012
 
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

Mousehook

  Alt 28. Mär 2012, 21:49
Hallo,
ich versuche mit einem Programm, welches im Hintergrund ständig läuft eine Mousetaste abzufangen und eine Reaktion in dem Programm auszulösen.
Das funtioniert, wenn ich den Hook direkt im Programm unterbringe, allerdings nur solange wie das Programm den Focus hat.
Ich habe jetzt den Hook in eine dll ausgelagert.
Mit dem gleichen Code wie im Programm funktiuonierte das nicht.
Ich habe deshalb hier im Forum einen Vorschlag aufgegriffen, der mit OpenFileMapping arbeitet.
Damit geht es erst mal.
Nach Postmessage setze ich in MouseProc WParam auf 0, da die Taste, egal in welchem Programm, keine weitere Wirkung haben soll.
Bei Delphi im Debugmodus kommt der Event immer 2 mal hintereinander. Ein normaler Mausclick im Fenster des Programmes, was den Hook einrichtet, führt zum Rechnerabsturz.
Delphi hängt sich so auf, das nur noch die Resettaste bleibt.
Starte ich das Programm außerhalb von Delphi, kommt der Event nur einmal. Ein anderes Mausereignis im Fenster führt jedoch ebenfalls zum Absturz.

Hier der dll - Code:
Delphi-Quellcode:
library MouseHook;

uses
  Windows,
  Messages;

{$R *.res}

type
  PHWND = ^HWND;

const
  WM_MOUSE_HOOK = WM_USER + 2013;
  WM_Mousekeydown = 523;
  WM_MousekeyUp = 524;


var
  hHook: LongWord = 0;
  hWndBuffer: PHWND;
  hMMF: THandle;

function MouseProc(nCode: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall;
begin
  Result := 0;
  if nCode < 0 then Exit;

  if WParam = WM_Mousekeydown then
  begin
    PostMessage(hwndBuffer^, WM_MOUSE_HOOK, WParam, 0);
    WParam := 0;
  end;
  Result := CallNextHookEx(hHook, nCode, wParam, lParam);
end;

function Mouse_CreateHook(hWnd: HWND): Boolean; stdcall;
var
  bHWND: PHWND;
begin
hMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE or SEC_COMMIT, 0, SizeOf(hWnd), 'EDO-SoftMouseHookHandle');
bHWND := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, SizeOf(HWND));
bHWND^ := hWnd;
UnmapViewOfFile(bHWND);
GetMem(hWndBuffer, SizeOf(HWND));
hWndBuffer^ := hWnd;
if hHook = 0 then
  hHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, hInstance, 0);
Result := hHook <> 0;
end;

function Mouse_DeleteHook: Boolean; stdcall;
begin
FreeMem(hWndBuffer);
CloseHandle(hMMF);
Result := UnhookWindowsHookEx(hHook);
hHook := 0;
end;

exports
  Mouse_CreateHook,
  Mouse_DeleteHook;

var
  MMF: THandle;

begin
MMF := OpenFileMapping(FILE_MAP_READ, false, 'EDO-SoftMouseHookHandle');
if MMF <> 0 then
  begin
  hWndBuffer := MapViewOfFile(MMF, FILE_MAP_READ, 0, 0, SizeOf(HWND));
  CloseHandle(MMF);
  end;
end.
Vielleicht noch der Hintergrund der Problematik.
Ich habe mir einen USB-Taster gekauft. Dieser generiert eine weitere Mousetaste (254).
Egal in welchem Programm ich gerade bin, soll das Drücken dieser Taste eine akkustische Funktion auslösen.

Hat wer eine Idee?

Gruß
Peter
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz