Câu hỏi của bạn đã thu hút sự quan tâm của tôi, vì vậy tôi đã tìm hiểu kỹ một chút và trong khi đó, rất tiếc là tôi không có câu trả lời thích hợp cho bạn, tôi nghĩ tôi sẽ chia sẻ những gì tôi có.
Tôi đã tìm thấy ví dụ này về tạo móc bàn phím (trong Delphi) được viết vào năm 1998, nhưng có thể biên dịch được trong Delphi 2007 với một vài chỉnh sửa.
Đó là một DLL với lệnh gọi SetWindowsHookEx
đi qua một hàm gọi lại, sau đó có thể chặn các thao tác gõ phím: Trong trường hợp này, nó đang tìm kiếm chúng cho vui, thay đổi con trỏ từ trái sang phải, v.v. Một ứng dụng đơn giản sau đó gọi DLL và báo cáo lại kết quả của nó dựa trên sự kiện TTimer. Nếu bạn quan tâm, tôi có thể đăng mã dựa trên Delphi 2007.
Nó được ghi chép và bình luận đầy đủ và bạn có thể sử dụng nó như một cơ sở để tìm ra vị trí của một lần nhấn phím. Nếu bạn có thể nhận được xử lý của ứng dụng đã gửi các phím bấm, bạn có thể theo dõi nó theo cách đó. Với tay cầm đó, bạn có thể lấy thông tin bạn cần một cách khá dễ dàng.
Các ứng dụng khác đã thử xác định phím nóng bằng cách xem qua Phím tắt của chúng vì chúng có thể chứa phím Phím tắt, chỉ là một thuật ngữ khác của phím nóng. Tuy nhiên, hầu hết các ứng dụng không có xu hướng đặt thuộc tính này nên nó có thể không trả về nhiều. Nếu bạn quan tâm đến tuyến đường đó, Delphi có quyền truy cập vào IShellLink
giao diện COM mà bạn có thể sử dụng để tải một phím tắt lên và lấy phím nóng của nó:
uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;
procedure GetShellLinkHotKey;
var
LinkFile : WideString;
SL: IShellLink;
PF: IPersistFile;
HotKey : Word;
HotKeyMod: Byte;
HotKeyText : string;
begin
LinkFile := 'C:\Temp\Temp.lnk';
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));
// The IShellLink implementer must also support the IPersistFile
// interface. Get an interface pointer to it.
PF := SL as IPersistFile;
// Load file into IPersistFile object
OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));
// Resolve the link by calling the Resolve interface function.
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
// Get hotkey info
OleCheck(SL.GetHotKey(HotKey));
// Extract the HotKey and Modifier properties.
HotKeyText := '';
HotKeyMod := Hi(HotKey);
if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
HotKeyText := 'ALT+';
if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
HotKeyText := HotKeyText + 'CTRL+';
if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
HotKeyText := HotKeyText + 'SHIFT+';
if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
HotKeyText := HotKeyText + 'Extended+';
HotKeyText := HotKeyText + Char(Lo(HotKey));
if (HotKeyText = '') or (HotKeyText = #0) then
HotKeyText := 'None';
ShowMessage('Shortcut Key - ' + HotKeyText);
end;
Nếu bạn có quyền truy cập vào Safari Books Online , có một phần hay về cách làm việc với các phím tắt / liên kết shell trong Hướng dẫn dành cho nhà phát triển Borland Delphi 6 của Steve Teixeira và Xavier Pacheco. Ví dụ của tôi ở trên là một phiên bản bị giết từ đó và trang web này .
Hy vọng rằng sẽ giúp!
WM_HOTKEY
thông báo trong Nhật ký tin nhắn sau khi nhấn phím nóng, bạn có thể cần chạy phiên bản 32-bit của Spy ++ .