![]() |
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:
Aber jedesmal öffnet sich das Start-Menü.
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; KeyPreview des Forms habe ich aktiviert... Ich habe es auch mit einem TApplicationEvents versucht:
Delphi-Quellcode:
Leider auch kein Erfolg...
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; |
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)
|
Re: Windows-Taste abfangen
Hooks Tutorial:
![]() |
Re: Windows-Taste abfangen
alles schön und gut.
Aber wie schaffe ich es, dass Windows selber nicht mehr auf die Windows-Taste reagiert? |
Re: Windows-Taste abfangen
due lässt einfach
Delphi-Quellcode:
in deinem Hook raus, wenn es sich um die Windows-Taste handelt
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
|
Re: Windows-Taste abfangen
Ich habe jetzt folgenden Code zur Bearbeitung eines Tastendrucks:
Erst die DLL:
Delphi-Quellcode:
Nun das Programm:
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.
Delphi-Quellcode:
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...
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. |
Re: Windows-Taste abfangen
Probier mal deine ersten Procedures im ersten Beitrag, aber mit Key := 0;
LG, ich |
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 02:46 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