VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

解決在WIN7下無法切換輸入法的程式,已可使用,但煩請修改更精簡

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
kinhome



註冊時間: 2010-04-22
文章: 27
來自: 台南

第 1 樓

發表發表於: 星期一 五月 24, 2010 6:57 pm    文章主題: 解決在WIN7下無法切換輸入法的程式,已可使用,但煩請修改更精簡 引言回覆

在win7下的輸入法不能切換的問題,但是win7以後被大家廣泛使用已是定局
搜尋幾位前輩及網路,拼湊後得到以下的程式
目前來說已經可以用了,但小弟能覺得有點不足
墾請有能力的前輩能進行修改,以便讓大家一起使用
以下是我電腦(win7)下的三種輸入法


1.先載入圖1的英文鍵盤,請在命令視窗先執行

Declare Long LoadKeyboardLayout In WIN32API String, Long
LoadKeyboardLayout('04090409',3)


修改:是否可修改不需要載入此種輸入法。
________________________________________________________
2.將以下的存成.prg檔

Lparameters m_user
If m_user=1
Dimension aList[1,3]
Declare Long GetKeyboardLayoutList In USER32 ;
LONG nCount, String @ lpList
Declare Long ImmGetDescription In imm32 ;
LONG hKL, String @ lpszDescription, Long nLen
Declare Long ImmGetIMEFileName In imm32 ;
LONG hKL, String @ lpszFileName, Long nLen
Declare Long ActivateKeyboardLayout In USER32 ;
LONG hKL, Integer Flags
nList = GetKeyboardLayoutList( 0, Null )
cList = Repl(Chr(0),(nList*4)+1)
nList = GetKeyboardLayoutList( nList, @cList )
lpszDescription = Repl(Chr(0),254)
lpszFileName = Repl(Chr(0),254)
Dimension aList[nList,3]
For iList=1 To nList
hKL = Str2LONG(Substr(cList,(4*iList)-3,4))
=ImmGetDescription(hKL,@lpszDescription,Len(lpszDescription))
aList[iList,2]=Left(lpszDescription,At(Chr(0),lpszDescription)-1)
= ImmGetIMEFileName(hKL,@lpszFileName,Len(lpszFileName))
aList[iList,3] = Left(lpszFileName,At(Chr(0),lpszFileName)-1)
aList[iList,1] = hKL
Endfor

For m_alen=1 To Alen(aList,1)
If aList(m_alen,1)<>67699721
ActivateKeyboardLayout(aList(m_alen,1),0)
Exit
Endif
Endfor




Else
Declare Long LoadKeyboardLayout In WIN32API String, Long
LoadKeyboardLayout('04090409',3)
Endif

Function Str2LONG
Lparameters cValue
Return Asc(Left(cValue,1)) + ;
asc(Substr(cValue,2,1))*256 + ;
asc(Substr(cValue,3,1))*65536 + ;
asc(Substr(cValue,4,1))*16777216
__________________________________________________________________________________________
3.執行此prg檔,執行前請先切換到您習慣使用的中文輸入法,只要切換一次就可以了(如.圖3)

=prg檔名(2) &&這是切換到英文輸入法(圖1)
=prg檔名(1) &&這是切換到注音輸入法(圖3)

___________________________________________________________________________________________

想要修改的問題如下
1.圖2就已經可以輸入英文了,可否不用預先載入圖1
2.是否可以不用事先切換到圖3,一切換後就會切換到 User習慣的輸入法,雖然這在XP也一樣。


以上~~麻煩各前輩,謹此致謝~~
回頂端
檢視會員個人資料 發送私人訊息
spfrk



註冊時間: 2004-11-08
文章: 161


第 2 樓

發表發表於: 星期一 五月 24, 2010 11:04 pm    文章主題: 引言回覆

有關在win7下的輸入法不能切換的問題,我已經搞了很久,所面臨的問題就是這樣, 如果要自己控制輸入法的切換,
那就要寫在TEXT物件中的EVENT中,但是又不完全,主要是因為 WIN7 是多國別的系統, 切換輸入法前是先要切換
國別的,kinhome 大大所列舉的 WINDOWS API 都是 NT5(XP)的, 至於NT6(WIN7) 則是用 TSF 來控輸入法, 但是
找遍了 VS2010 MSDN 都沒有 TSF 的詳細說明,因此就觸礁了!
回頂端
檢視會員個人資料 發送私人訊息
kinhome



註冊時間: 2010-04-22
文章: 27
來自: 台南

第 3 樓

發表發表於: 星期二 五月 25, 2010 1:59 pm    文章主題: 引言回覆

spfrk 寫到:
至於NT6(WIN7) 則是用 TSF 來控輸入法!


那麼在xp系統也可以用TSF控制嗎??

目前我的做法是把一些應該載入或是偵測使用者的輸入法,全部都在主程式一次載入。
之後在text的類別中只有使用ActivateKeyboardLayout(aList(m_alen,1),0)
測試結果滑鼠的游標不會有停頓或卡卡的現象。
同樣的程式在xp及win7中測試都很順。

現在最大的缺點是無法在主程式中切換成中文輸入法(圖3),keyboard "{Ctrl+spacebar}"沒有作用。
所以需要使用者開啟表單後,第一次要自行切換到中文輸入法(圖3),之後不管再開任何的表單都不需要再自行切換了。

請問各位前輩,可否提供keyboard "{Ctrl+spacebar}"的替代方案,翻了很多方法,在win7+vfp9的情況下,均失效~~~~
回頂端
檢視會員個人資料 發送私人訊息
spfrk



註冊時間: 2004-11-08
文章: 161


第 4 樓

發表發表於: 星期二 五月 25, 2010 10:53 pm    文章主題: 引言回覆

可否提供keyboard "{Ctrl+spacebar}, 這個方法我也找過了,想用直接送 SCAN CODE 到 KEYBOARD BUFFER
x0041e-x0043e, 這樣總可以吧 ! 好像可以, 可是因為 NT 系統統是不准 USER PROGRAM 直接做 I/O的, 必須
安裝一個 inpout32.dll 的驅動程式, 來幫你送資料到KEYBOARD BUFFER, 這樣一來, 其不是更麻煩了, 所以又
觸礁了, TSF 是 .NET FRAMEWORK 3 的成員, 只要有它, 就可以使用 TSF, 只是現在找不到 TSF 的完整技術資料
與展示程式, 在MSDN中有找到一些片段的說明, 但是根本連不起來, 目前只有慢慢的等瞜, 每隔1個月,再找找看,
應該會有答案.
回頂端
檢視會員個人資料 發送私人訊息
sheuok



註冊時間: 2004-11-20
文章: 63
來自: Taiwan

第 5 樓

發表發表於: 星期五 十月 15, 2010 9:46 pm    文章主題: WIN7 下使用程式切換中英文... 引言回覆

Function uf_中英切換(ulp_模式)
Declare Integer ActivateKeyboardLayout In user32 Integer hkl, Integer nFlags
If ulp_模式="中"
ActivateKeyboardLayout(0x04040404,0)
Else &&-英
ActivateKeyboardLayout(0x04090409,0)
Endif
Endfunc

第一次請將用手動切換成您要的輸入法,然後便可呼叫上述函數切換中英文
至於如何在第一次便可用程式自動切到所需輸入法,還在找資料研究中....
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
alung



註冊時間: 2005-11-23
文章: 80


第 6 樓

發表發表於: 星期四 十一月 19, 2015 10:12 am    文章主題: Re: WIN7 下使用程式切換中英文... 引言回覆

sheuok 寫到:
Function uf_中英切換(ulp_模式)
Declare Integer ActivateKeyboardLayout In user32 Integer hkl, Integer nFlags
If ulp_模式="中"
ActivateKeyboardLayout(0x04040404,0)
Else &&-英
ActivateKeyboardLayout(0x04090409,0)
Endif
Endfunc

不好意思,我把上面的 function 整個copy到主程式prg,執行後卻一閃而過跳出主程式,不知是合原因? 有人知道嗎? 謝謝幫忙

第一次請將用手動切換成您要的輸入法,然後便可呼叫上述函數切換中英文
至於如何在第一次便可用程式自動切到所需輸入法,還在找資料研究中....
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1644


第 7 樓

發表發表於: 星期四 十一月 19, 2015 11:27 am    文章主題: 引言回覆

自動切換輸入法問題,我認為【差不多】就好,不必耗費太多精神在上面,
理由是,不管您如何耗盡精神,都不能十全十美,萬無一失
一百台電腦,其中肯定會有幾台電腦不聽使喚
客戶依然會來投訴。
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
alung



註冊時間: 2005-11-23
文章: 80


第 8 樓

發表發表於: 星期四 十一月 19, 2015 12:10 pm    文章主題: 引言回覆

ckp6250 寫到:
自動切換輸入法問題,我認為【差不多】就好,不必耗費太多精神在上面,
理由是,不管您如何耗盡精神,都不能十全十美,萬無一失
一百台電腦,其中肯定會有幾台電腦不聽使喚
客戶依然會來投訴。


恩恩~我也是想用簡單的就好了,主程式.prg裡面在do form之前的任何位置隨便加個函數~執行就會一閃跳離主程式
function aa
EndFunc

拿掉時又變正常,很奇怪
回頂端
檢視會員個人資料 發送私人訊息
alung



註冊時間: 2005-11-23
文章: 80


第 9 樓

發表發表於: 星期四 十一月 19, 2015 12:16 pm    文章主題: 引言回覆

alung 寫到:
ckp6250 寫到:
自動切換輸入法問題,我認為【差不多】就好,不必耗費太多精神在上面,
理由是,不管您如何耗盡精神,都不能十全十美,萬無一失
一百台電腦,其中肯定會有幾台電腦不聽使喚
客戶依然會來投訴。


恩恩~我也是想用簡單的就好了,主程式.prg裡面在do form之前的任何位置隨便加個函數~執行就會一閃跳離主程式
function aa
EndFunc

拿掉時又變正常,很奇怪

感覺
do from 下一行的 READ EVENTS 無作用(失效)
回頂端
檢視會員個人資料 發送私人訊息
alung



註冊時間: 2005-11-23
文章: 80


第 10 樓

發表發表於: 星期四 十一月 19, 2015 12:53 pm    文章主題: 引言回覆

alung 寫到:
alung 寫到:
ckp6250 寫到:
自動切換輸入法問題,我認為【差不多】就好,不必耗費太多精神在上面,
理由是,不管您如何耗盡精神,都不能十全十美,萬無一失
一百台電腦,其中肯定會有幾台電腦不聽使喚
客戶依然會來投訴。


恩恩~我也是想用簡單的就好了,主程式.prg裡面在do form之前的任何位置隨便加個函數~執行就會一閃跳離主程式
function aa
EndFunc

拿掉時又變正常,很奇怪

感覺
do from 下一行的 READ EVENTS 無作用(失效)

我把Function uf_中英切換(ulp_模式)
Declare Integer ActivateKeyboardLayout In user32 Integer hkl, Integer nFlags
If ulp_模式="中"
ActivateKeyboardLayout(0x04040404,0)
Else &&-英
ActivateKeyboardLayout(0x04090409,0)
Endif
Endfunc
置放至另一支prg就正常,
但在text1.value 物件 Getfocus程序裡
uf_中英切換(0) 時發生檔案`uf_中英切換.prg`不存在
uf_中英切換(0)不是執行自訂函數的方式嗎?
回頂端
檢視會員個人資料 發送私人訊息
perry



註冊時間: 2014-07-20
文章: 203


第 11 樓

發表發表於: 星期四 十一月 19, 2015 4:29 pm    文章主題: 引言回覆

放在主程式最下方,
或單獨成立 .prg,單獨prg時將 Proc uf_IME 及 EndProc 刪掉
代碼:

Proc uf_IME
    Lpar ulp_Io
    ulp_Io=IIF(para()#1 or vartype(ulp_Io)#'N' or ulp_Io#1,0,1)
    Declare Integer ActivateKeyboardLayout In user32 Integer hkl, Integer nFlags
    If ulp_Io=1
        ActivateKeyboardLayout(0x04040404,0)
    Else &&-英
        ActivateKeyboardLayout(0x04090409,0)
    Endif
EndProc

prg 方式可以2種用法 do uf_IME with 1 or =uf_IME(1)
PS.並不是每個人都習慣或想要自動切換...
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1644


第 12 樓

發表發表於: 星期四 十一月 19, 2015 8:16 pm    文章主題: 引言回覆

只do乙次可能無效
應該是每個textbox中都do 一 do

我個人是在when 中去do
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
alung



註冊時間: 2005-11-23
文章: 80


第 13 樓

發表發表於: 星期五 十一月 20, 2015 9:04 am    文章主題: 引言回覆

perry 寫到:
放在主程式最下方,
或單獨成立 .prg,單獨prg時將 Proc uf_IME 及 EndProc 刪掉
代碼:

Proc uf_IME
    Lpar ulp_Io
    ulp_Io=IIF(para()#1 or vartype(ulp_Io)#'N' or ulp_Io#1,0,1)
    Declare Integer ActivateKeyboardLayout In user32 Integer hkl, Integer nFlags
    If ulp_Io=1
        ActivateKeyboardLayout(0x04040404,0)
    Else &&-英
        ActivateKeyboardLayout(0x04090409,0)
    Endif
EndProc

prg 方式可以2種用法 do uf_IME with 1 or =uf_IME(1)
PS.並不是每個人都習慣或想要自動切換...


感謝 perry 再次的幫忙,有去測試了,但轉換英數無效
後來我去參考樓主 kinhome 發文的部份,把轉換英數那一行改成
ActivateKeyboardLayout(0x04090409,3) 就ok了
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作