1. 程式人生 > >切換輸入法半形全形(開啟關閉輸入法)

切換輸入法半形全形(開啟關閉輸入法)

 #include   "winuser.h"  
  #include   "imm.h"  
  #pragma   comment(lib,"imm32")  
   
  HKL   hKL[2];  
  HKL   hCurKL;  
   
  hCurKL=GetKeyboardLayout(0);       //儲存初始輸入法  
  GetKeyboardLayoutList(2,hKL);     //獲取輸入法列表,只獲取兩項  
   
  void   CIMESampleDlg::OnSetfocusEdit1()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  if(hCurKL==hKL[0])     hCurKL=hKL[1];     //選擇第一種輸入法  
          ActivateKeyboardLayout(hCurKL,KLF_SUBSTITUTE_OK);       //切換輸入法  
   
  HIMC   hIMC;  
  DWORD   dwConv,   dwSent;  
  hIMC=ImmGetContext(m_hWnd);  
  ImmGetConversionStatus(hIMC,&dwConv,&dwSent);  
   
  if((dwConv   &   IME_CMODE_LANGUAGE)   !=   IME_CMODE_NATIVE)  
  {  
  dwConv   &=   ~IME_CMODE_LANGUAGE;  
  dwConv   |=   IME_CMODE_NATIVE;           //中文輸入狀態  
  }

  //標註1
  if   (!(dwConv   &   IME_CMODE_FULLSHAPE))     dwConv   |=   IME_CMODE_FULLSHAPE;     //全形  
  if   (!(dwConv   &   IME_CMODE_SYMBOL))           dwConv   |=   IME_CMODE_SYMBOL;           //中文標點  

  //標註2

  //若要切換輸入法為半形,只需把上面的標註1判斷改為如下即可(自己用到時有此要求,所以在原作者繼承上自己改了下)

  if (dwConv & IME_CMODE_FULLSHAPE)
         dwConv &= ~IME_CMODE_FULLSHAPE;
  if (dwConv & IME_CMODE_SYMBOL)
         dwConv &= ~IME_CMODE_SYMBOL;

 
  ImmSetConversionStatus(hIMC,dwConv,dwSent);  
  ImmReleaseContext(m_hWnd,hIMC);  
  }  
   
  void   CIMESampleDlg::OnKillfocusEdit1()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  hCurKL=GetKeyboardLayout(0);               //儲存現有的輸入法  
  ActivateKeyboardLayout(hKL[0],KLF_SUBSTITUTE_OK);         //關閉輸入法  
  }  

---(下面是自己新增的)------------------------------------------------------------------------------------

同樣對於日文輸入法而言,可以通過上面的方法進行全半形切換,不過還有個前提:上面的方法需要開啟IME才行,因為在“直接入力”(Direct Input)狀態上面的方法不能切換全半形等狀態,如果需要由“直接入力”(Direct Input)切換到其他如"ひらがな"等狀態,需要通過::ImmSetOpenStatus(hImc, TRUE);開啟IME,同樣如果想由其他狀態切換到“直接入力”(Direct Input),只需::ImmSetOpenStatus(hImc, FALSE);即可