国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WPF 自定義文本框輸入法 IME 跟隨光標(biāo)

這篇具有很好參考價(jià)值的文章主要介紹了WPF 自定義文本框輸入法 IME 跟隨光標(biāo)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Python微信訂餐小程序課程視頻

https://edu.csdn.net/course/detail/36074

Python實(shí)戰(zhàn)量化交易理財(cái)系統(tǒng)

https://edu.csdn.net/course/detail/35475
本文告訴大家在 WPF 寫一個(gè)自定義的文本框,如何實(shí)現(xiàn)讓輸入法跟隨光標(biāo)

本文非小白向,本文適合想開(kāi)發(fā)自定義的文本框,從底層開(kāi)始開(kāi)發(fā)的文本庫(kù)的伙伴。在開(kāi)始之前,期望了解了文本庫(kù)開(kāi)發(fā)的基礎(chǔ)知識(shí)

本文實(shí)現(xiàn)的效果如下

WPF 自定義文本框輸入法 IME 跟隨光標(biāo)

實(shí)現(xiàn)

本文的方法參考了 WPF 官方倉(cāng)庫(kù)的邏輯,可以在 WPF 倉(cāng)庫(kù)的 wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Documents\ImmComposition.cs 文件看到官方是如何讓 TextBox 控件獲取輸入法焦點(diǎn),和在輸入光標(biāo)變更時(shí),修改輸入法的輸入框坐標(biāo)

先了解一下輸入法的相關(guān)知識(shí)。在 Windows 編程開(kāi)發(fā)里,輸入法框架有三套,其中用的最多的是第二套。第二套是采用 IMM 進(jìn)行對(duì)接的。所謂 IMM 就是 Input Method Manager 也就是 輸入法管理器

相關(guān)的另一個(gè)縮寫詞 IME 則是 Input Method Editor 或者是 Input Method Engine 的縮寫,含義是輸入法編輯器或輸入法引擎

應(yīng)用程序可以通過(guò) IMM 對(duì)接輸入法。所用的 win32 的 API 重點(diǎn)是如下幾個(gè)

  • ImmGetContext 獲取輸入法上下文,用于后續(xù)所有的其他函數(shù)調(diào)用
  • ImmAssociateContext 關(guān)聯(lián)輸入法和對(duì)應(yīng)的窗口,讓輸入法了解在哪個(gè)窗口輸入
  • ImmSetCompositionWindow 用來(lái)設(shè)置輸入法的窗口的坐標(biāo),也是本文最重要的函數(shù)

本文接下來(lái)將告訴大家如何一步步實(shí)現(xiàn)封裝對(duì) IME 輸入法調(diào)用,在本文最后將會(huì)給出所有的源代碼

這部分對(duì)輸入法的邏輯可以封裝為一個(gè)類,這樣上層就可以不關(guān)注細(xì)節(jié)邏輯。如例子代碼,放在 IMESupporter 類型里

為了方便文本框的接入,咱再定義一個(gè)接口,用于設(shè)置文本框需要實(shí)現(xiàn)一些方法,用來(lái)提供參數(shù)給 IMESupporter 使用才能進(jìn)行接入

    /// 
    /// 表示控件支持被輸入法
    /// 
    interface IIMETextEditor
    {
        /// 
        /// 獲取當(dāng)前使用的字體名
        /// 
        /// 
        string GetFontFamilyName();

        /// 
        /// 獲取字號(hào)大小,單位和 WPF 的 FontSize 相同
        /// 
        /// 
        int GetFontSize();

        /// 
        /// 獲取輸入框的左上角的點(diǎn),用于設(shè)置輸入法的左上角。此點(diǎn)相對(duì)于  所在元素坐標(biāo)。對(duì)大部分控件來(lái)說(shuō),都應(yīng)該是 0,0 點(diǎn)
        /// 
        /// 
        Point GetTextEditorLeftTop();

        /// 
        /// 獲取光標(biāo)的輸入左上角的點(diǎn)。此點(diǎn)相對(duì)于  所在元素坐標(biāo)
        /// 
        /// 
        Point GetCaretLeftTop();
    }

對(duì)于如微軟拼音等輸入法,是支持設(shè)置輸入法的文本大小和字體。因此就需要文本框提供 GetFontFamilyName 和 GetFontSize 方法

而 GetCaretLeftTop 自然就是用來(lái)讓輸入法跟隨的。為了讓文本框可以做更多的定制,也需要 GetTextEditorLeftTop 方法,這個(gè)方法的返回值對(duì)大部分自定義的文本框控件來(lái)說(shuō),都應(yīng)該是 0,0 點(diǎn)

在 IMESupporter 類型構(gòu)造函數(shù),期望傳入文本框控件,如此可以解決初始化值和監(jiān)聽(tīng)的鍋

    internal class IMESupporter<T> where T : UIElement, IIMETextEditor
    {
        // ReSharper disable InconsistentNaming
        public IMESupporter(T editor)
        {
            Editor = editor;
            // 忽略代碼
        }
    }

為了同時(shí)約束傳入的文本框控件繼承 UIElement 和 IIMETextEditor 接口,用了泛形

在文本框控件 Editor 獲取焦點(diǎn)的時(shí)候,將需要喚起輸入法進(jìn)行輸入。在 Editor 失去焦點(diǎn)的時(shí)候,就應(yīng)該告訴輸入法當(dāng)前不進(jìn)行輸入

        public IMESupporter(T editor)
        {
            Editor = editor;
            Editor.GotKeyboardFocus += Editor_GotKeyboardFocus;
            Editor.LostKeyboardFocus += Editor_LostKeyboardFocus;
        }

        private T Editor { get; }

根據(jù) WPF 的約定,對(duì)自定義的支持輸入法的控件,需要設(shè)置 IsInputMethodSuspendedProperty 附加屬性,如下面代碼

            InputMethod.SetIsInputMethodSuspended(editor, true);

Editor_GotKeyboardFocus 需要實(shí)現(xiàn)的邏輯是調(diào)起輸入法和設(shè)置初始的輸入框的坐標(biāo)。如上文,開(kāi)始之前,需要先拿到輸入法上下文。在拿到輸入法上下文之前,可以先獲取默認(rèn)的 IME 類窗口句柄。先獲取默認(rèn)的 IME 類窗口句柄是為了在多進(jìn)程嵌入窗口時(shí),讓微軟拼音輸入法的輸入框跟隨輸入光標(biāo)而不是在左上角

            _defaultImeWnd = IMENative.ImmGetDefaultIMEWnd(IntPtr.Zero);

以上的 _defaultImeWnd 是一個(gè)字段,在 IMESu文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-442773.html

到了這里,關(guān)于WPF 自定義文本框輸入法 IME 跟隨光標(biāo)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android同文輸入法的使用(開(kāi)源輸入法Trime)

    Android同文輸入法的使用(開(kāi)源輸入法Trime)

    想找一款開(kāi)源的Android中文輸入法,然后發(fā)現(xiàn)了這款備受推崇的輸入法框架rime。 RIME/中州韻輸入法引擎,是一個(gè)跨平臺(tái)的輸入法算法框架。 基于這一框架,Rime 開(kāi)發(fā)者與其他開(kāi)源社區(qū)的參與者在 Windows、macOS、Linux、Android 等平臺(tái)上創(chuàng)造了不同的輸入法前端實(shí)現(xiàn)。 這真的非???/p>

    2023年04月08日
    瀏覽(25)
  • 卸載流氓軟件云龍輸入法和智能云輸入法的方法

    希望中國(guó)互聯(lián)網(wǎng)擺脫垃圾軟件捆綁 步驟一:win+R ,輸入 regedit,進(jìn)入注冊(cè)表編輯器 步驟二:在計(jì)算機(jī)HKEY_LOCAL_MACHINESOFTWAREMicrosoftCTFTIP(這下面有好多注冊(cè)表) 步驟三:點(diǎn)擊‘編輯’,在查找中直接輸入‘智能云’,然后把下面的相應(yīng)的文件刪除就可以了。注意:我刪除的

    2024年02月07日
    瀏覽(107)
  • android 12.0 第三方輸入法app設(shè)置系統(tǒng)默認(rèn)輸入法

    在12.0的產(chǎn)品開(kāi)發(fā)中,有功能需要要求設(shè)置默認(rèn)輸入法,替換掉系統(tǒng)的輸入法,所以這就需要了解設(shè)置輸入法的相關(guān)功能需求,然后根據(jù)輸入法包名來(lái)設(shè)置默認(rèn)輸入法 在設(shè)置系統(tǒng)默認(rèn)輸入法中 每個(gè)系統(tǒng)輸入法的id不同 根據(jù)id設(shè)置輸入法 需要先根據(jù)需要設(shè)置默認(rèn)輸入法的id,來(lái)

    2024年02月07日
    瀏覽(102)
  • 科大訊飛勾勒生成式AI輸入法“模樣”,開(kāi)啟下一代輸入法革命

    科大訊飛勾勒生成式AI輸入法“模樣”,開(kāi)啟下一代輸入法革命

    回顧國(guó)內(nèi)第三方輸入法賽道近十余年的發(fā)展,移動(dòng)互聯(lián)網(wǎng)的市場(chǎng)紅利催生了科大訊飛、百度、搜狗等頗具規(guī)模和實(shí)力的頭部廠商。與此同時(shí),歷經(jīng)多年、多方角逐,第三方輸入法市場(chǎng)進(jìn)入存量階段,升級(jí)技術(shù)、優(yōu)化用戶體驗(yàn)來(lái)挖掘存量,成為決定競(jìng)爭(zhēng)勝負(fù)的關(guān)鍵。 恰逢ChatG

    2024年02月07日
    瀏覽(20)
  • Win10自帶輸入法怎么刪除-Win10卸載微軟輸入法的方法

    Win10自帶輸入法怎么刪除-Win10卸載微軟輸入法的方法

    Win10 自帶輸入法怎么刪除?Win10系統(tǒng)自帶輸入法就是微軟輸入法,這個(gè)輸入法滿足了很多用戶的輸入需求。但是,有些用戶想要使用其它的輸入法,這時(shí)候就想刪除掉微軟輸入法。下面小編給大家介紹最簡(jiǎn)單方便的卸載方法吧。 Win10卸載微軟輸入法的方法: 1. 在任務(wù)欄的語(yǔ)言

    2024年02月07日
    瀏覽(22)
  • 蘋果手機(jī)怎么設(shè)置九宮格輸入法?快速切換九鍵輸入法,輕松學(xué)會(huì)

    蘋果手機(jī)怎么設(shè)置九宮格輸入法?快速切換九鍵輸入法,輕松學(xué)會(huì)

    蘋果手機(jī)與安卓手機(jī)有很大的不同,從安卓手機(jī)切換成蘋果手機(jī),不少的小伙伴表示不是很適應(yīng)。有些習(xí)慣了使用九宮格輸入法的小伙伴發(fā)現(xiàn)自己的蘋果手機(jī)是26鍵輸入法,不知道蘋果手機(jī)怎么設(shè)置九宮格輸入法。別擔(dān)心,下面小編就來(lái)教你如何快速切換九宮格輸入法。 ? 不

    2024年02月09日
    瀏覽(16)
  • linux安裝搜狗輸入法后無(wú)法輸入中文

    linux安裝搜狗輸入法后無(wú)法輸入中文

    linux安裝sogou輸入法參考官網(wǎng)教程,https://shurufa.sogou.com/linux/guide 如下圖所示,安裝后可以在右上角狀態(tài)欄看到sogou輸入法,但是只能輸入英文,無(wú)法輸入中文。 解決方法如下:

    2024年02月13日
    瀏覽(29)
  • Qt/C++中英輸入法/嵌入式輸入法/小數(shù)字面板/簡(jiǎn)繁切換/特殊字符/支持Qt456

    Qt/C++中英輸入法/嵌入式輸入法/小數(shù)字面板/簡(jiǎn)繁切換/特殊字符/支持Qt456

    在嵌入式板子上由于沒(méi)有系統(tǒng)層面的輸入法支持,所以都繞不開(kāi)一個(gè)問(wèn)題,那就是在需要輸入的UI軟件中,必須提供一個(gè)輸入法來(lái)進(jìn)行輸入,大概從Qt5.7開(kāi)始官方提供了輸入法的源碼,作為插件的形式加入到Qt中,這里需要特別提示的是,該源碼是gpl的,商業(yè)應(yīng)用對(duì)這個(gè)比較不

    2024年01月21日
    瀏覽(18)
  • Ubuntu——搜狗輸入法

    Ubuntu——搜狗輸入法

    ?? 因?yàn)楣ぷ髟蛞\(yùn)用到Linux,對(duì)于新手來(lái)說(shuō)最容易上手的就是Ubuntu,在安裝了Ubuntu之后,第一件事當(dāng)然就是安裝一個(gè)可以使用的漢語(yǔ)輸入法,在這里我選擇的是搜狗輸入法的安裝。 1.Ctrl+Alt+T,打開(kāi)終端Terminal; 2.先添加以下源,在終端輸入命令: 然后輸入密碼 3.更新一下

    2024年02月15日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包