掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
HotKeyを使って右コントロールキー上下でPageUpDownさせたい (ID:36362)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんにちは。 右コントロールキーと、カーソルキーの組み合わせで ホットキーを動作させたいと思いました。 なぜかというと、dynabook UX というネットブックのFnキーの位置が かっこよかったので、 (ダイナブックシリーズは右下にFnというのが採用されているようですね) それを自分のノートPCでも、模擬的にまねできないかと思ったからです。 Ctrl+↑・↓、を、PageUp・PageDown、に割り当て Ctrl+←・→、を、Home・Endキーに割り当てたいと考えています。 右にあるCtrlキーだけです。 ところが、 ホットキーは、Ctrlキーの左右を別にして登録などできない(らしい)ので なかなか難しく実現できていません。 上手なやり方をご存じでしたら、教えてください。 次のコードを書いたのですが、うまく動きません。 ----- unit Unit12; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm12 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; public { Public declarations } end; var Form12: TForm12; implementation {$R *.dfm} procedure SetHotKeyToOS(Handle: THandle; HotKeyNumber: Integer; VirtualKey: Word; Shift, Ctrl, Alt, Win: Boolean); var Modifiers: Word; begin Modifiers := 0; if Shift then Modifiers := Modifiers or MOD_SHIFT; if Ctrl then Modifiers := Modifiers or MOD_CONTROL; if Alt then Modifiers := Modifiers or MOD_ALT; if Win then Modifiers := Modifiers or MOD_WIN; RegisterHotKey(Handle, HotKeyNumber, Modifiers, VirtualKey); end; function GetAsyncKeyState_Delphi(iKey: Integer): Boolean; begin Result := BOOL(Hi(GetAsyncKeyState(iKey))); end; procedure TForm12.WMHotKey(var Msg: TWMHotKey); begin case Msg.HotKey of 1: begin if GetAsyncKeyState_Delphi(VK_RCONTROL) then begin //keybd_event(VK_RCONTROL, 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_PRIOR , 0, 0, 0); keybd_event(VK_PRIOR , 0, KEYEVENTF_KEYUP, 0); //keybd_event(VK_RCONTROL, 0, 0, 0); end else begin UnregisterHotKey(Self.Handle, 1); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event(VK_UP , 0, 0, 0); keybd_event(VK_UP , 0, KEYEVENTF_KEYUP, 0); SethotKeyToOS(Self.Handle, 1, VK_UP, False, True, False, False); end; end; 2: begin if GetAsyncKeyState_Delphi(VK_RCONTROL) then begin //keybd_event(VK_RCONTROL, 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_NEXT , 0, 0, 0); keybd_event(VK_NEXT , 0, KEYEVENTF_KEYUP, 0); //keybd_event(VK_RCONTROL, 0, 0, 0); end else begin UnregisterHotKey(Self.Handle, 2); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event(VK_DOWN , 0, 0, 0); keybd_event(VK_DOWN , 0, KEYEVENTF_KEYUP, 0); SethotKeyToOS(Self.Handle, 2, VK_DOWN, False, True, False, False); end; end; end; end; procedure TForm12.FormCreate(Sender: TObject); begin SethotKeyToOS(Self.Handle, 1, VK_UP, False, True, False, False); SethotKeyToOS(Self.Handle, 2, VK_DOWN, False, True, False, False); end; procedure TForm12.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if CanClose then begin UnregisterHotKey(Self.Handle, 1); UnregisterHotKey(Self.Handle, 2); end; end; end. ----- 動作としては、左コントロールキー+上下キーなら、HOTKETが効いて WMHOTKEYに処理がきて 改めてコード上で左コントロールキー+上下キーを送信しています。 こちらはうまくうごいています。 右コントロールキー+上下キーの場合 ページアップ、ダウンだけを送りたいのに コードで制御しようとしても、 コントロールキー+ページアップダウンになってしまいます。 keybd_eventが、VK_RCONTROLとVK_LCONTROLとを 区別出来ないようなのですが、 何かよい解決策をご存知でしたら教えてください。 よろしくお願いします。 いろいろ工夫したんですが、うまくいかないんですよね....
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.