[Unity 3d] TouchKeyBoardComponent - 屏幕鍵盤加載器

今天教大家怎么在 Unity 開發(fā)的APP中喚起 軟鍵盤坷衍,在surface 上測試OK 溉跃,把踩到的坑都填上了,故而文中代碼開袋即食啸澡。

需求:

在Surface 上點擊了輸入框卸奉,在沒有物理鍵盤的情況下必須彈出軟鍵盤。

實現(xiàn):

  • 使用 Process.Start(string path ) 開啟這個軟鍵盤泉蝌。
  • 使用 Win32API PostMessage 關(guān)閉軟鍵盤歇万。
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

namespace zFrame.Extend
{
    [RequireComponent(typeof(InputField))]
    public class TouchKeyBoardComponent : MonoBehaviour, ISelectHandler, IDeselectHandler
    {
        InputField field;
        [SerializeField] bool forcePopup = false;
        static Coroutine closeCoroutine = null;

        void Start()
        {
            field = GetComponent<InputField>();
        }

        static TouchKeyBoardComponent()  //靜態(tài)構(gòu)造,無論多少實例全局只執(zhí)行一次勋陪。能夠避免某些時候軟鍵盤首次無法喚起的異常
        {
            HideKeyboard();
        }

        #region Coroutine 
        IEnumerator DelayOpen()
        {
            yield return new WaitForEndOfFrame();  //延遲開啟 贪磺,避免多個 InputField 輸入數(shù)據(jù)相同的問題
            string _file = "C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe";
            if (File.Exists(_file))
            {
                using (Process _process = Process.Start(_file)) { };
            }
        }
        IEnumerator DelayQuit()
        {
            yield return new WaitForSecondsRealtime(0.1f);
            HideKeyboard();
        }
        #endregion

        static void HideKeyboard()
        {
            try
            {
                IntPtr _touchhWnd = IntPtr.Zero;
                _touchhWnd = FindWindow("IPTip_Main_Window", null);
                if (_touchhWnd != IntPtr.Zero) PostMessage(_touchhWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
            }
            catch { }
        }

        #region EventSystem Interface Implement
        void ISelectHandler.OnSelect(BaseEventData eventData)
        {
            PointerEventData data = eventData as PointerEventData;
            //如果不是鼠標(biāo)左鍵觸發(fā)的選中事件就證明是Touch觸發(fā)的,那么就可以歡快的彈軟鍵盤啦诅愚!
            if (forcePopup || (null != data && data.pointerId != -1))
            {
                if (null != closeCoroutine) //及時的阻止軟鍵盤的關(guān)閉動作寒锚,避免了軟鍵盤的反反復(fù)復(fù)的折疊與展開
                {
                    StopCoroutine(closeCoroutine);
                    closeCoroutine = null;
                }
                StartCoroutine("DelayOpen");
            }
        }

        void IDeselectHandler.OnDeselect(BaseEventData eventData)
        {
            //不關(guān)心哪個輸入框取消了選中都延遲折疊軟鍵盤,因為延遲违孝,所以點了下一個輸入框還能保持軟鍵盤喚起刹前。
            if (null == closeCoroutine)
            {
                closeCoroutine = StartCoroutine("DelayQuit");
            }
        }
        #endregion

        #region Win32API Wrapper
        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "PostMessage")]
        private static extern bool PostMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);
        private const Int32 WM_SYSCOMMAND = 274;
        private const UInt32 SC_CLOSE = 61536;
        #endregion
    }
}

填坑:

  1. 跳選其他輸入框時,軟鍵盤也會反反復(fù)復(fù)折疊又彈出雌桑。
    • 解決方案: 將軟鍵盤的關(guān)閉動作寫到協(xié)程中延遲執(zhí)行喇喉,如果在準(zhǔn)備折疊的過程中被喚起,那么就取消折疊校坑,也就避免了這個影響用戶體驗的問題拣技。
  2. 連續(xù)跳選多個輸入框并彈出軟鍵盤后,只要一輸入撒踪,所有輸入框都會輸入同樣的數(shù)據(jù)过咬。
    • 解決方案: 在使用 Process.Start(string path) 開啟軟鍵盤前先延遲一幀即可解決問題。
  3. 如果一不小心點了哪個屏幕鍵盤的關(guān)閉鍵制妄,然后再怎么點輸入框都無法喚起軟鍵盤怎么辦掸绞?
    • 解決方案: 點擊空白區(qū)域停頓大于0.1秒再選中輸入框即可喚起。
  4. 在接了物理鍵盤時耕捞,怎么都喚不起軟鍵盤衔掸。
    • 解決方案: 暫無解決方案,這是Surface 的設(shè)定(應(yīng)該可以找到相關(guān)的設(shè)置項)俺抽。

演示:

  1. 演示了 1 號坑: 切換輸入框必須先折疊再彈出
  2. 演示了 2 號坑:多個輸入框輸入相同的數(shù)據(jù)


擴展閱讀:

[Unity 3D] 檢測 Windows 是否接了物理鍵盤 - 簡書

轉(zhuǎn)載請注明出處敞映,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磷斧,一起剝皮案震驚了整個濱河市振愿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弛饭,老刑警劉巖冕末,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侣颂,居然都是意外死亡档桃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門憔晒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藻肄,“玉大人蔑舞,你說我怎么就攤上這事∴谕停” “怎么了攻询?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抚垄。 經(jīng)常有香客問我蜕窿,道長,這世上最難降的妖魔是什么呆馁? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任桐经,我火速辦了婚禮,結(jié)果婚禮上浙滤,老公的妹妹穿的比我還像新娘阴挣。我一直安慰自己,他們只是感情好纺腊,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布畔咧。 她就那樣靜靜地躺著,像睡著了一般揖膜。 火紅的嫁衣襯著肌膚如雪誓沸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天壹粟,我揣著相機與錄音拜隧,去河邊找鬼。 笑死趁仙,一個胖子當(dāng)著我的面吹牛洪添,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雀费,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼干奢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盏袄?” 一聲冷哼從身側(cè)響起忿峻,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辕羽,沒想到半個月后逛尚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡逛漫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赘艳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酌毡。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡克握,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枷踏,到底是詐尸還是另有隱情菩暗,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布旭蠕,位于F島的核電站停团,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掏熬。R本人自食惡果不足惜佑稠,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旗芬。 院中可真熱鬧舌胶,春花似錦、人聲如沸疮丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誊薄。三九已至履恩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呢蔫,已是汗流浹背切心。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咐刨,地道東北人昙衅。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像定鸟,于是被迫代替她去往敵國和親而涉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 可能這些是你想要的H5軟鍵盤兼容方案 前言 輸入框獲取焦點联予,軟鍵盤彈起啼县,要求輸入框吸附(或頂)在輸入法框上。需求很...
    記住了_葉閱讀 779評論 0 2
  • 本文轉(zhuǎn)載自wuwhs的segmentfault專欄 最近一段時間在做 H5 聊天項目沸久,踩過其中一大坑:輸入框獲取焦...
    兔子不打地鼠打代碼閱讀 10,204評論 1 12
  • 之前在做H5 項目季眷,踩過其中一大坑:輸入框獲取焦點,軟鍵盤彈起卷胯,要求輸入框吸附(或頂)在輸入法框上子刮。需求很明確,看...
    超級無敵可愛的閱讀 2,287評論 0 3
  • 善心善念善行: 1.早上和李球友練球感覺很好,最后和高個打比賽三比零贏了他挺峡,好開心 2.早上做了冥想和拍打葵孤,好棒 ...
    豐盛富足閱讀 207評論 0 1
  • 提綱: 1 什么是感情? 之前認(rèn)為的感情是兩個人長相廝守橱赠,一起體驗生活的美尤仍,太平到老,就是幸福的感情了狭姨。 現(xiàn)在宰啦,覺...
    zhoul_m閱讀 820評論 0 1