Board logo

標題: VBA 設定輸入法(中英文鍵盤) [打印本頁]

作者: Scott090    時間: 2015-4-8 15:47     標題: VBA 設定輸入法(中英文鍵盤)

請問哪位大大指導一下
如何在VBA中設定變更輸入法的方法

謝謝先
作者: Scott090    時間: 2015-4-8 22:25

回復 1# Scott090


    有在本論壇找到類似的,不過 要在 表單或 TEXTBOX或類似此物件的情況之下;問題未解決
作者: luhpro    時間: 2015-4-8 23:51

請問哪位大大指導一下
如何在VBA中設定變更輸入法的方法

謝謝先
Scott090 發表於 2015-4-8 15:47


以 Windows 8 來說可以這樣實現 : (XP 設定方式類似, 請自行參照設定)
[attach]20608[/attach]
作者: Scott090    時間: 2015-4-9 14:01

回復 3# luhpro


    我的系統是 Win8.1  注音輸入法
下圖為設定情況
[attach]20613[/attach]
  1. '這個每執行一次就只會再狀態 A與B 交換,不會是能被掌握的狀態
  2. Sub KeyBoard()
  3.     SendKeys "^ ", True
  4. '       Application.Wait Now + TimeValue("00:00:02")
  5. End Sub

  6. '這個沒反應
  7. Sub KeyBoard1()
  8.     SendKeys "^+1", True
  9.     Application.Wait Now + TimeValue("00:00:02")
  10. End Sub

  11. '這個沒反應
  12. Sub KeyBoard0()
  13.     SendKeys "%+", True
  14.     Application.Wait Now + TimeValue("00:00:02")
  15. End Sub
複製代碼
不知問題在哪裡
敬請指導
作者: Scott090    時間: 2015-4-9 14:29

回復 3# luhpro


    補充說明:
#4 內 3 段程式都會使 數字鍵盤的 NumLock 來回的 鎖定與釋放
作者: luhpro    時間: 2015-4-11 06:43

本帖最後由 luhpro 於 2015-4-11 06:52 編輯

Sendkeys 巨集的陳述式

我的系統是 Win 7 搭配 Excel 2003 與 Excel 2013 測試過都可以正常運作喔.

因為我沒有 Win 8,
不能測試在Win 8中這些複合按鍵的反應是否有差別.

最簡單的確認方式是你可以開 Word:

'這個每執行一次就只會再狀態 A與B 交換,不會是能被掌握的狀態
    SendKeys "^ ", True

此項複合按鍵是 Ctrl + Space(空白鍵) , 功能是在 輸入英文模式 與 輸入中文模式 間來回切換.
之後直接在鍵盤上按著 Ctrl  鍵不放,
再按一下 空白 鍵,
接著放掉 Ctrl 鍵,
看輸入法切換是否正常,

'這個沒反應
    SendKeys "^+1", True

此項複合按鍵是 Ctrl + Shift + 1 , 依你的設定功能是切換到微軟注音.
或者按著 Ctrl  鍵與 Shift 鍵不放,
再按一下 1 按鍵,(數字鍵建議都使用鍵盤右邊數字鍵區中的按鍵, 左邊的數字鍵有時會有不同的意義)
接著放掉所有按鍵,
看輸入法是否有切換到微軟注音,
若沒反應可能是系統設定需要再做調整.

看圖說故事,
依你擷取的畫面我猜測,
你可以試試在後面那個  進階設定畫面 中,
切換輸入法 項下,
讓我為每個應用程式視窗...
將那個打勾 並套用後看看是否能正常切換.
[attach]20626[/attach]

'這個沒反應
    SendKeys "%+", True

這個沒反應是正常的,
%+ 是同時按下 Alt 與 Shift 按鍵,
沒有搭配同時按下其他按鍵不應該有反應.

回復  luhpro
    補充說明:
#4 內 3 段程式都會使 數字鍵盤的 NumLock 來回的 鎖定與釋放
Scott090 發表於 2015-4-9 14:29

這裡看不到你呼叫 KeyBoard 那些副程式的方式,
如果呼叫前後有迴圈那麼有可能執行數次 KeyBoard 副程式(按鍵好幾次了),
這一點也是需要確認的.

另外這一行:
Application.Wait Now + TimeValue("00:00:02")
可以通通用 ' 把它 Mark 掉,
因為 SendKeys  後面放 True,
已經會等到輸入狀態切換完畢才會繼續執行下去,
不需要再執行等待作業.

或者你也可以在 即時運算視窗 中輸入:
SendKeys "^ ", True

SendKeys "^+1", True
後按下 Enter 按鍵直接執行.
看輸入模式是否有正確切換過去,
若這裡不能正確切換,
那放進 VBA 程式碼中也不會正確切換.
作者: Scott090    時間: 2015-4-12 10:38

回復 6# luhpro


    依照指導:
1.勾選 "... 為每個應用程式視窗設定 .... ", 試驗結果是沒有幫助的
2.使用即時運算視窗和 逐步執行(手按 Enter逐條執行)片段程式的結果是一樣的;
3.雖然 Sendkeys 有 wait的參數, 還是無法確保其正確執行;
4.我的電腦是 OS Win8.1  微軟注音,經分析後其狀態與輸入鍵的關係如圖
[attach]20631[/attach]
5.依照分析表作下列程式碼
  1. '使鍵盤成為 "英文" 輸入狀態
  2. Sub ChangeIMEToE()
  3.     If IMEStatus = 1 Then
  4.         SendKeys "+", True
  5.     End If
  6. End Sub

  7. '使鍵盤成為 "微軟注音"輸入狀態
  8. Sub ChangeIMEToC()
  9. '    Call ActiveIMEKeyBoard("微軟注音")
  10. '    Debug.Print "0,"; IMEStatus

  11. '假如狀態是 C, send a "Shift" key
  12.   If IMEStatus = 2 Then SendKeys "+", True ': Sleep 1500
  13.   DoEvents
  14. '  Debug.Print "1,"; IMEStatus
  15.   
  16.   ''假如狀態是 B, send a "Ctrl Space" keys
  17.   If IMEStatus = 2 Then SendKeys "^ ", True
  18.   DoEvents
  19. '  Debug.Print "2,"; IMEStatus
  20.   
  21.   '假如上一個 B狀態之起始狀態是 C,這時得狀態 C, send a "+" key
  22.   If IMEStatus = 2 Then SendKeys "+", True ': Sleep 500
  23.   DoEvents
  24. '  Debug.Print "3,"; IMEStatus, vbLf

  25. End Sub
複製代碼
試驗的結果: 可用
1.Sendkeys ,True 不成功
2.加 Application.wait ...   不成功
3. 呼叫 API sleep ...  不成功
4. 用 DoEvents OK

以上是實驗的結果,請指教

也許尋找 Win8.1 API 可能會有更直接泛用的答案




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)