![]() |
Hotkey wert aus Shortcut lesbar und zurück
Hallo, ich bekomme es einfach nicht hin, ich öffne eine Shortcut-Datei (.lnk), lese alles aus, das klappt auch soweit.
Als Hotkey wird mir ein "Word" mitgeteilt. Nun wollte ich es erreichen das ich das auch lesbar habe und habe eine Hotkey komponente auf Form abgelegt. Ich hatte gehofft ein "HotKey1.HotKey := Word(Wert);" reicht aus, aber das Feld bleibt immer leer. Mein zweiter Anlauf war so "edHotKey.Text := ShortcutToText( Word(Wert) ); (aus Unit Menus) da kamen zumindest Erfolge, da ich tatsächlich als Rückgabe einen "Key" erhalte, nur leider schluckt der alle Ur-Informationen wie zum Beispiel "ALT" oder "CTRL" Eine kombination aus THotkey und dem ShortcutToText half auch nicht oder ich wende es falsch an. Wie könnte ich einen Hotkey Word Wert eines Link Files lesbar konvertieren, hat da jemand Ahnung von? |
AW: Hotkey wert aus Shortcut lesbar und zurück
Da mein Rechner sowieso gerade völlig ausgelastet ist, habe ich mal kurz gesucht und
![]() Klingt für mich, als wäre es das, was du suchst. |
AW: Hotkey wert aus Shortcut lesbar und zurück
Schau doch in die Doku was in dem Word wirklich enthalten ist:
Zitat:
![]() |
AW: Hotkey wert aus Shortcut lesbar und zurück
Euer beides vermengt sollte mich ans Ziel bringen, vielen Dank!
|
AW: Hotkey wert aus Shortcut lesbar und zurück
Delphi-Quellcode:
Dem Beispiel folgend hab ich es übernommen, jetzt Fehlen nur noch die F-Tasten, da bekomme ich noch blödsinn aber ansonsten klappt es schon.
edHotKey.Text := '';
HotKeyMod := Hi( SLI.HotKey ); if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then edHotKey.Text := 'ALT+'; if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then edHotKey.Text := edHotKey.Text + 'CTRL+'; if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then edHotKey.Text := edHotKey.Text + 'SHIFT+'; if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then edHotKey.Text := edHotKey.Text + 'Extended+'; edHotKey.Text := edHotKey.Text + Char(Lo(SLI.HotKey)); if (edHotKey.Text = '') or (edHotKey.Text = #0) then edHotKey.Text := '(None)'; |
AW: Hotkey wert aus Shortcut lesbar und zurück
Ich habe da irgendwann mal folgendes ShortCutToText gefunden:
Delphi-Quellcode:
resourcestring
SmkcBkSp = 'BkSp'; SmkcTab = 'Tab'; SmkcEsc = 'Esc'; SmkcEnter = 'Enter'; SmkcSpace = 'Space'; SmkcPgUp = 'PgUp'; SmkcPgDn = 'PgDn'; SmkcEnd = 'End'; SmkcHome = 'Home'; SmkcLeft = 'Left'; SmkcUp = 'Up'; SmkcRight = 'Right'; SmkcDown = 'Down'; SmkcIns = 'Ins'; SmkcDel = 'Del'; SmkcShift = 'Shift+'; SmkcCtrl = 'Ctrl+'; SmkcAlt = 'Alt+'; type TMenuKeyCap = (mkcBkSp, mkcTab, mkcEsc, mkcEnter, mkcSpace, mkcPgUp, mkcPgDn, mkcEnd, mkcHome, mkcLeft, mkcUp, mkcRight, mkcDown, mkcIns, mkcDel, mkcShift, mkcCtrl, mkcAlt); var MenuKeyCaps: array[TMenuKeyCap] of string = ( SmkcBkSp, SmkcTab, SmkcEsc, SmkcEnter, SmkcSpace, SmkcPgUp, SmkcPgDn, SmkcEnd, SmkcHome, SmkcLeft, SmkcUp, SmkcRight, SmkcDown, SmkcIns, SmkcDel, SmkcShift, SmkcCtrl, SmkcAlt); implementation function GetSpecialName(ShortCut: TShortCut): string; var ScanCode: Integer; KeyName: array[0..255] of Char; begin Result := ''; ScanCode := MapVirtualKey(LoByte(Word(ShortCut)), 0) shl 16; if ScanCode <> 0 then begin if GetKeyNameText(ScanCode, KeyName, Length(KeyName)) <> 0 then Result := KeyName else Result := ''; end; end; function ShortCutToText(ShortCut: TShortCut): string; var Name: string; Key: Byte; begin Key := LoByte(Word(ShortCut)); case Key of $08, $09: Name := MenuKeyCaps[TMenuKeyCap(Ord(mkcBkSp) + Key - $08)]; $0D: Name := MenuKeyCaps[mkcEnter]; $1B: Name := MenuKeyCaps[mkcEsc]; $20..$28: Name := MenuKeyCaps[TMenuKeyCap(Ord(mkcSpace) + Key - $20)]; $2D..$2E: Name := MenuKeyCaps[TMenuKeyCap(Ord(mkcIns) + Key - $2D)]; $30..$39: Name := Chr(Key - $30 + Ord('0')); $41..$5A: Name := Chr(Key - $41 + Ord('A')); $60..$69: Name := Chr(Key - $60 + Ord('0')); $70..$87: Name := 'F' + IntToStr(Key - $6F); else Name := GetSpecialName(ShortCut); end; if Name <> '' then begin Result := ''; if ShortCut and scShift <> 0 then Result := Result + MenuKeyCaps[mkcShift]; if ShortCut and scCtrl <> 0 then Result := Result + MenuKeyCaps[mkcCtrl]; if ShortCut and scAlt <> 0 then Result := Result + MenuKeyCaps[mkcAlt]; Result := Result + Name; end else Result := ''; end; |
AW: Hotkey wert aus Shortcut lesbar und zurück
Zitat:
Das ist jetzt allerdings reines Reverse-Engineering: Ich habe einen Shortcut mit und ohne Hotkey verglichen und mir den Rest zusammengereimt. |
AW: Hotkey wert aus Shortcut lesbar und zurück
Also das auslesen klappt perfekt.
(SLI ist ein Record fürs LinkFile)
Delphi-Quellcode:
so sind die checkboxen korrekt gesetzt, im edHotKey.Text steht nur der Key.
edHotKey.Text := '';
HotKeyMod := Hi( SLI.HotKey ); cbALT.Checked := (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT; cbCTRL.Checked := (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL; cbSHIFT.Checked := (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT; edHotKey.Text := ShortcutToText( SLI.HotKey ); aber beim schreiben stell ich mich noch zu dumm an
Delphi-Quellcode:
HotKeyMod := 0;
if cbALT.Checked then HotKeyMod := ( HotKeyMod and HOTKEYF_ALT ); if cbCTRL.Checked then HotKeyMod := ( HotKeyMod and HOTKEYF_CONTROL ); if cbSHIFT.Checked then HotKeyMod := ( HotKeyMod and HOTKEYF_SHIFT ); SLI.HotKey := ( Hi( HotKeyMod ) and Lo( TextToShortcut( edHotKey.Text ) ) ); |
AW: Hotkey wert aus Shortcut lesbar und zurück
Um es hier auch erwähnt zu haben, so ist es nun gelöst.
Ich und die verschiedenen Typen und Lo und Hi und AND und OR und all das :-) nenene, da hat mir ein Profi geholfen, ich war zu unerfahren in dem Moment.
Delphi-Quellcode:
if cbALT.Checked then HotKeyMod := ( HotKeyMod or HOTKEYF_ALT );
if cbCTRL.Checked then HotKeyMod := ( HotKeyMod or HOTKEYF_CONTROL ); if cbSHIFT.Checked then HotKeyMod := ( HotKeyMod or HOTKEYF_SHIFT ); SLI.HotKey := ( ( HotKeyMod SHL 8 ) or ( TextToShortcut( edHotKey.Text ) AND $FF ) ); // SLI.HotKey ebenso wie HotKeyMod entsprechen Typ "Word" // am Ende bekommt man praktisch zwei Bytes hintereinander als Word abgelegt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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