1. 程式人生 > 其它 >C# 呼叫系統軟鍵盤

C# 呼叫系統軟鍵盤

技術標籤:WPFC#C# 呼叫系統軟鍵盤呼叫軟鍵盤

using RetailApp.Core.Utils;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace RetailApp.Core.SystemUtils
{
    /// <summary>
    /// 觸控鍵盤工具類
    /// </summary>
    class TouchKeyBoard
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
        private const UInt32 WM_SYSCOMMAND = 0x112;
        private const UInt32 SC_RESTORE = 0xf120;
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
        private const string OnScreenKeyboadApplication = "osk.exe";


        /// <summary>
        /// 啟用系統軟鍵盤
        /// </summary>
        public static void OpenKeyBoardFun()
        {
            try
            {
                //判斷軟鍵盤是否程序是否已經存在,如果不存在進行呼叫
                Process[] pro = Process.GetProcessesByName("osk");
                //如果鍵盤已開啟,則進行關閉操作
                if (pro != null && pro.Length > 0)
                {
                    CloseKeyBoardFun();
                    return;
                }

                // Get the name of the On screen keyboard
                string processName = System.IO.Path.GetFileNameWithoutExtension(OnScreenKeyboadApplication);

                // Check whether the application is not running 
                var query = from process in Process.GetProcesses()
                            where process.ProcessName == processName
                            select process;

                var keyboardProcess = query.FirstOrDefault();

                // launch it if it doesn't exist
                if (keyboardProcess == null)
                {
                    IntPtr ptr = new IntPtr(); ;
                    bool sucessfullyDisabledWow64Redirect = false;

                    // Disable x64 directory virtualization if we're on x64,
                    // otherwise keyboard launch will fail.
                    if (System.Environment.Is64BitOperatingSystem)
                    {
                        sucessfullyDisabledWow64Redirect = Wow64DisableWow64FsRedirection(ref ptr);
                    }

                    // osk.exe is in windows/system folder. So we can directky call it without path
                    using (Process osk = new Process())
                    {
                        osk.StartInfo.FileName = OnScreenKeyboadApplication;
                        osk.Start();
                        //osk.WaitForInputIdle(2000);
                    }

                    // Re-enable directory virtualisation if it was disabled.
                    if (System.Environment.Is64BitOperatingSystem)
                        if (sucessfullyDisabledWow64Redirect)
                            Wow64RevertWow64FsRedirection(ptr);
                }
                else
                {
                    // Bring keyboard to the front if it's already running
                    var windowHandle = keyboardProcess.MainWindowHandle;
                    SendMessage(windowHandle, WM_SYSCOMMAND, new IntPtr(SC_RESTORE), new IntPtr(0));
                }

            }
            catch (Exception ex)
            {
                LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.Message);
                LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.StackTrace);
            }
            
        }


        /// <summary>
        /// 關閉系統軟鍵盤
        /// </summary>
        public static void CloseKeyBoardFun()
        {
            try
            {
                Process[] pros = Process.GetProcessesByName("osk");
                foreach (Process p in pros)
                {
                    p.Kill();
                }
            }
            catch (Exception ex)
            {
                LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.Message);
                LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.StackTrace);
            }
            
        }


    }



}