AGB  ·  Datenschutz  ·  Impressum  







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

Windows-Taste abfangen

Ein Thema von DevilsCamp · begonnen am 19. Sep 2005 · letzter Beitrag vom 22. Sep 2005
Antwort Antwort
DevilsCamp
(Gast)

n/a Beiträge
 
#1

Windows-Taste abfangen

  Alt 19. Sep 2005, 08:17
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...
  Mit Zitat antworten Zitat
McLane

Registriert seit: 4. Sep 2004
37 Beiträge
 
Delphi 5 Professional
 
#2

Re: Windows-Taste abfangen

  Alt 21. Sep 2005, 19:09
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)
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Windows-Taste abfangen

  Alt 21. Sep 2005, 19:36
Hooks Tutorial: http://www.dsdt.info/tutorials/hooks/
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#4

Re: Windows-Taste abfangen

  Alt 22. Sep 2005, 09:16
alles schön und gut.

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

Registriert seit: 4. Sep 2004
37 Beiträge
 
Delphi 5 Professional
 
#5

Re: Windows-Taste abfangen

  Alt 22. Sep 2005, 13:19
due lässt einfach
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); in deinem Hook raus, wenn es sich um die Windows-Taste handelt
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#6

Re: Windows-Taste abfangen

  Alt 22. Sep 2005, 13:32
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...
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Freak
Delphi-Freak

Registriert seit: 26. Sep 2004
Ort: Wien Nähe (Österreich)
321 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Windows-Taste abfangen

  Alt 22. Sep 2005, 13:39
Probier mal deine ersten Procedures im ersten Beitrag, aber mit Key := 0;

LG, ich
Gerhard Pfister
*
»To him who loves us and has freed us from our sins by his blood [...] be glory and power for ever and ever! Amen.« (Revelation*1,*5?6)
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#8

Re: Windows-Taste abfangen

  Alt 22. Sep 2005, 13:49
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...
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:22 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