Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Windows-Taste abfangen (https://www.delphipraxis.net/53565-windows-taste-abfangen.html)

DevilsCamp 19. Sep 2005 07:17


Windows-Taste abfangen
 
Ich habe zwar herausgefunden, wie ich testen kann, ob die Windows-Taste gedrückt wurde, aber wie verhindere ich es, dass sich danach das Start-Menü öffnet?

Ich habe folgenden Code:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_LWIN) then
    Edit1.Text := 'WIN'
  else
    Edit1.Text := '';

  Key := 0;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_LWIN) then
    Key := 0;
end;
Aber jedesmal öffnet sich das Start-Menü.

KeyPreview des Forms habe ich aktiviert...


Ich habe es auch mit einem TApplicationEvents versucht:
Delphi-Quellcode:
  if (Msg.message=WM_KEYDOWN) then
  begin
    if (Msg.wParam=VK_LWIN) then
    begin
      Edit1.Text := 'WIN';
      Msg.wParam := 0;
    end;

    Handled := true;
  end;
  if (Msg.message=WM_KEYUP) then
  begin
    if (Msg.wParam=VK_LWIN) then
    begin
      Msg.wParam := 0;
    end;

    Handled := true;
  end;
end;
Leider auch kein Erfolg...

McLane 21. Sep 2005 18:09

Re: Windows-Taste abfangen
 
was du brauchst ist ein hook. die delhpi hilfe wird dir da weiterhelfen... ich meine hier auch irgendwo mal ein howto zu dem thema gefunden zu haben. in deinem speziellem fall musst du dann die weiterleitung an die eigentliche callback-funktion nur abschalten (was das heißt steht in dem howto. sorry, hab gerade kein beispiel greifbar)

faux 21. Sep 2005 18:36

Re: Windows-Taste abfangen
 
Hooks Tutorial: http://www.dsdt.info/tutorials/hooks/

DevilsCamp 22. Sep 2005 08:16

Re: Windows-Taste abfangen
 
alles schön und gut.

Aber wie schaffe ich es, dass Windows selber nicht mehr auf die Windows-Taste reagiert?

McLane 22. Sep 2005 12:19

Re: Windows-Taste abfangen
 
due lässt einfach
Delphi-Quellcode:
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
in deinem Hook raus, wenn es sich um die Windows-Taste handelt

DevilsCamp 22. Sep 2005 12:32

Re: Windows-Taste abfangen
 
Ich habe jetzt folgenden Code zur Bearbeitung eines Tastendrucks:

Erst die DLL:
Delphi-Quellcode:
library hooktest_dll;

uses
  Windows,
  Messages;

const
  keybmsg='KbHookMsg_MR';

var
  HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;
  WM_KEYBHOOKMSG :Cardinal = 0;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  case nCode < 0 of
    TRUE: Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
    FALSE:
      begin
        if (wParam=VK_LWIN) then
        begin
          SendMessage(HWND_BROADCAST, WM_KEYBHOOKMSG, wParam, lParam);
          Result := 0;
        end
        else
          Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
      end;
  end;
end;

function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then begin
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
    SetProp(Hwnd,keybmsg,WM_KEYBHOOKMSG);
    WindowHandle := Hwnd;
    Result := TRUE;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
  InstallHook,
  UninstallHook;

begin
  WM_KEYBHOOKMSG := RegisterWindowMessage(keybmsg);
end.
Nun das Programm:
Delphi-Quellcode:
unit hooktest_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  keybmsg='KbHookMsg_MR';

type
  TInstallHook = function(Hwnd: THandle): Boolean; stdcall;
  TUninstallHook = function: Boolean; stdcall;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  WM_KEYBHOOKMSG :Cardinal = 0;
  InstallHook: TInstallHook;
  UninstallHook: TUninstallHook;
  lib: Cardinal;
   
implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  lib := LoadLibrary('hooktest_dll');
  if lib <> INVALID_HANDLE_VALUE then begin
    InstallHook := GetProcAddress(lib, 'InstallHook');
    UnInstallHook := GetProcAddress(lib, 'UninstallHook');
  end; // else ERROR
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  InstallHook(Self.Handle);
  WM_KEYBHOOKMSG := getprop(Self.Handle,keybmsg);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  UninstallHook;
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
  if (Message.Msg=WM_KEYBHOOKMSG) then
  begin
    SetForegroundWindow(Self.Handle);
    ShowMessage(Chr(Message.WParam));
  end;
   
  inherited;
end;

end.
Aber trotzdem öffnet sich beim drücken der Windows-Taste noch das Start-Menü. Da ich die Taste aber zum Einrichten eines System-Weiten HotKeys drücken muss/will, sollte sich natürlich nicht gleich das Startmenü öffnen...

Delphi-Freak 22. Sep 2005 12:39

Re: Windows-Taste abfangen
 
Probier mal deine ersten Procedures im ersten Beitrag, aber mit Key := 0;

LG, ich

DevilsCamp 22. Sep 2005 12:49

Re: Windows-Taste abfangen
 
Immer noch kein Erfolg :(

Es muss aber irgendwie möglich sein, da ich schon diverse Spiele gespielt habe, bei denen die Windows-Taste irgnedwie deaktiviert wurde...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz