SSブログ

Access小僧:CapsLock, NumLock, IMEモードを設定 [コンピューター]

Accessのフォームのテキストボックスがフォーカス取得したら、
・CapsLock:OFF
・NumLock:ON
・IMEモード:半角英数、または、全角ひらがな
に設定するVBAを作ってみました。

【フォームのクラスオブジェクト】

Private Sub myYear1_GotFocus()
  '【機能】フォーカス取得後、IMEModeを設定、NumLockをON、CapsLockをOFF
  '【変数】
  Dim Name1 As String ' 名前
  Dim Obj1 As Object ' オブジェクト
  '【実行コード】
  Name1 = Me.ActiveControl.Name ' アクティブなコントロールの名前
  Debug.Print "Name1=" & Name1 & " [myYear1_GotFocus]"
  Set Obj1 = Me.myYear1 ' このコントロールのオブジェクト
  Debug.Print "Obj1.Name=" & Obj1.Name & " [myYear1_GotFocus]"
  Call mySChkKey1(Name1, Obj1, acImeModeAlpha) ' IMEMode(半角英数)を設定、NumLockをON、CapsLockをOFF
  Set Obj1 = Nothing ' オブジェクト変数を解放
End Sub

注1:IMEモードを全角ひらがなにする場合は、mySChkKey1の第3引数をacImeModeHiraganaにする。
注2:myYear1がテキストボックスの名前

【標準モジュールの先頭】
標準モジュールの先頭にWindows APIを呼び出すための記述をする。

#If VBA7 And Win64 Then
' 64bit (PtrSafeが無いとエラーになる)
Declare PtrSafe Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long)
#Else
' 32bit
Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

【標準モジュール】

Public Sub mySChkKey1(Name1 As String, Obj1 As Object, myIMEMode1 As Integer)
  '【機能】NumLockキーがOFFだったら、ONにする
  '【引数】
  ' Name1:アクティブなコントロールの名前
  ' Obj1:呼び出し側のコントロールのオブジェクト
  ' myIMEMode1:IMEMode(半角英数とか)
  '【変数】
  Dim nKey As Integer ' NumLockキーの状態
  Dim Name2 As String ' 名前
  '【実行コード】
  ' 呼び出し側のコントロールとアクティブなコントロールが不一致の場合は終了
  Name2 = Obj1.Name
  Debug.Print "Name1=" & Name1 & " [mySChkKey1]"
  Debug.Print "Name2=" & Name2 & " [mySChkKey1]"
  If Name1 <> Name2 Then
    Exit Sub
  End If
  ' IMEモードの設定
  Debug.Print "myIMEMode1=" & myIMEMode1 & " [mySChkKey1]"
  Obj1.IMEMode = myIMEMode1
  Obj1.IMEHold = False
  ' NumLockキーの確認、設定
  nKey = GetKeyState(vbKeyNumlock) And 1 ' NumLockキーの状態
  Debug.Print "nKey(NumLock)=" & nKey & " [mySChkKey1]"
  ' NumLock : OFF -> ON
  If nKey = 0 Then
    Call mySendKeys1("{NUMLOCK}", False)
  End If
  ' Sleepは、特に意味ない
  Sleep 1
  ' CapsLockキーの確認、設定
  nKey = GetKeyState(vbKeyCapital) And 1 ' CapsLockキーの状態
  Debug.Print "nKey(CapsLock)=" & nKey & " [mySChkKey1]"
  ' CapsLock : ON->OFF
  If nKey = 1 Then
    Call mySendKeys1("{CAPSLOCK}", False)
  End If
End Sub

Public Sub mySendKeys1(Keys As String, Optional Wait As Boolean = False)
  '【機能】キー操作を疑似的に起こす
  '【変数】
  Static wshShell As Object ' Static変数はファイルを閉じるまで値が残る
  '【実行コード】
  If wshShell Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
  Call wshShell.SendKeys(Keys, Wait)
End Sub

【参考】
キーボードの状態を取得 : Access
VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 - Office 2010,2013
VBAのキーコード一覧
VBAで疑似的にキーボード入力を行う(SendKeys)
【Access】テキストボックスのIMEモードを切り替える
タグ:VBA access
ヤバイぜ!(6)  コメント(1) 
共通テーマ:パソコン・インターネット

ヤバイぜ! 6

コメント 1

cheese999

ヤバイぜ、ありがとうございます。
by cheese999 (2023-10-13 12:17) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字(英大文字の「オー」、英小文字の「ユー」、アラビア数字の「ハチ」、アラビア数字の「イチ」、アラビア数字の「ニ」)を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。