■HotKey
HotKeyを使えばシステムフックを使わずにキー入力を取得できます。
つまりこれを使えば、アプリケーションのショートカットを作成・変更できるということです。
▽HotKey.bas
Option Explicit Private Declare Function RegisterHotKey Lib "user32" ( _ ByVal hWnd As Long, _ ByVal id As Long, _ ByVal fsModifiers As Long, _ ByVal vk As Long _ ) As Long Private Declare Function UnregisterHotKey Lib "user32" ( _ ByVal hWnd As Long, _ ByVal id As Long _ ) As Long Private Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" ( _ ByVal lpString As String _ ) As Integer Private Declare Function GlobalDeleteAtom Lib "kernel32" ( _ ByVal nAtom As Integer _ ) As Integer Private Const MOD_ALT = &H1 Private Const MOD_CONTROL = &H2 Private Const MOD_SHIFT = &H4 Public Function CreateHotKey(ByVal hWnd As Long, _ ByVal sHotKeyName As String, _ ByVal bShift As Boolean, _ ByVal bCtrl As Boolean, _ ByVal bAlt As Boolean, _ ByVal lVKey As Long) As Long Dim nID As Long nID = GlobalAddAtom(sHotKeyName) Call RegisterHotKey(hWnd, nID, IIf(bShift, MOD_SHIFT, 0) + IIf(bCtrl, MOD_CONTROL, 0) + IIf(bAlt, MOD_ALT, 0), lVKey) CreateHotKey = nID End Function Public Sub DeleteHotKey(ByVal hWnd As Long, ByVal nID As Long) Call UnregisterHotKey(hWnd, nID) Call GlobalDeleteAtom(nID) End Sub |
CreateHotKeyでHotKeyを登録して、DeleteHotKeyで削除。
CreateHotKey | |
hWnd | WM_HOTKEYを処理するウィンドウのハンドル。 |
sHotKeyName | ホットキーの名前。適当に。 |
bShift | シフトキー |
bCtrl | コントロールキー |
bAlt | Altキー |
lVKey | 仮想キー |
戻り値 | ホットキーのID |
例えば、Ctrl+Shift+Nを登録したい場合、
m_IdNew = CreateHotKey(Me.hWnd, "Painter_New", True, True, False, vbKeyN) |
DeleteHotKey | |
hWnd | CreateHotKeyで指定したhWnd |
nID | CreateHotKeyの戻り値 |
Hotkeyが押された場合、hWndで指定したウィンドウにWM_HOTKEYが飛んでくるので、それを捕まえて処理をします。
wParamにはCreateHotKeyの戻り値(ID)が入っているので、それで処理分けできます。
あとは、対象のアプリにメッセージを送って各動作を行わせればいいわけです。
FindWindow APIで親のハンドルを探した後、EnumChildWIndows
APIやChildWindowFromPoint
API等でツールボックスのウィンドウハンドルを取得、そこへWM_LBUTTONDOWNとWM_LBUTTONUPをSendmessage
してやる等すれば上手く行きます。
キーストロークはVB標準のSendkeysとか……。
これを汎用的なプログラムにするには一苦労ですが、自分の環境でとりあえず使ってみたい機能を実装するくらいなら簡単です。
プログラム(Win32API)の知識がある程度必要ですが、ショートカットに不満がある人はやってみる価値はあるかも。