2008年8月4日 星期一

用VBA呼叫API 切換輸入法(IME)

用VBA呼叫API 切換輸入法(IME):

Private Declare Function GetKeyboardLayoutList Lib "user32" (ByVal nBuff As Long, lpList As Long) As Long
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal hkl As Long, ByVal flags As Long) As Long
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Private Declare Function ImmGetDescription Lib "imm32.dll" Alias "ImmGetDescriptionA" (ByVal hkl As Long, ByVal lpsz As String, ByVal uBufLen As Long) As Long
'取得某個中文輸入法的Keyboard Handle ImeNmae傳入"大易" "注音" 等
'傳回0表示沒有找到
Public Function GetIMEKeyBoardHandle(ByVal ImeName As String) As Long
Dim hkb5(24) As Long, i As Long
Dim kln As String
Dim BuffLen As Long
Dim Buff As String
Dim RetStr As String, res As Long
Dim RetCount As Long, LayOutNo As Long

Buff = String(255, 0)
BuffLen = 255
kln = String(8, 0)
LayOutNo = GetKeyboardLayoutList(25, hkb5(0))
GetIMEKeyBoardHandle = 0
For i = 0 To LayOutNo - 1
ActivateKeyboardLayout hkb5(i), 0
res = GetKeyboardLayoutName(kln)
RetCount = ImmGetDescription(hkb5(i), Buff, BuffLen)
RetStr = Left(Buff, RetCount)
If InStr(1, RetStr, ImeName) <> 0 Then
GetIMEKeyBoardHandle = hkb5(i)
Exit Function
End If
Next i
End Function

'設定某個中文輸入法
Public Function ActiveIMEKeyBoard(ByVal ImeName As String) As Boolean
Dim hkbd As Long, i As Long
ActiveIMEKeyBoard = True
hkbd = GetIMEKeyBoardHandle(ImeName)
If hkbd <> 0 Then
i = ActivateKeyboardLayout(hkbd, 0)
If i <> 0 Then
ActiveIMEKeyBoard = True
End If
End If
End Function

Sub ChangeIMEToE()
Call ActiveIMEKeyBoard("English (American)")
End Sub

Sub ChangeIMEToC()
Call ActiveIMEKeyBoard("注音")
End Sub

5 則留言:

潘奎佑 提到...

你好:
我在知識家看到你解釋的程式,不知是否也可以幫我的忙!謝謝!
Private Sub Worksheet_Change(ByVal T As Range)
If T.Count > 1 Then Exit Sub
If T.Column = 2 And Cells(T.Row, 1) <> "" Then
Cells(T.Row - 1, 3).AutoFill Destination:=Range(Cells(T.Row - 1, 3), Cells(T.Row, 3))
End If
End Sub


我很學vba,如果你願意收為徒,願付費,方法是,我問你答的方式,至於記費你可以提出。

謝謝!如打擾深感歉意。

雲庭 提到...

你好:
目前我很想往"資料庫"發展.有聽過補習班老師說過VBA
看到你有好多VBA文章.但是我從沒上過VBA課程可以請教初學者應該從哪一篇看起?順序?
不好意思~麻煩你了 ^^"

Jacky Lu 提到...

買本說自行研讀比較好喔!

雲庭 提到...
作者已經移除這則留言。
雲庭 提到...

我是初學者.不知道應該買哪一本書才比較看得懂~"~

可以指點一下嗎?? ^^"

謝謝!!