Python调用windows系统自带触控键盘TabTip.exe

这篇具有很好参考价值的文章主要介绍了Python调用windows系统自带触控键盘TabTip.exe。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求

之前在用python(PySide2/PyQt5)开发windows触屏应用时遇到一个显而易见的需求:调用触控键盘输入文字。

想实现的效果:

  • 点击输入框,键盘自动弹出。
  • 再次点击输入框,键盘关闭。

Python调用windows系统自带触控键盘TabTip.exe

二、原理探究

众所周知windows系统(win10和win11)是支持触屏的,系统本身自带两个触控键盘:

  1. osk.exe,位于C:\Windows\System32
  2. TabTip.exe,位于C:\Program Files\Common Files\microsoft shared\ink

其中osk.exe是旧版,功能和界面都比较落后,如今已不再被使用。而TabTip.exe则是触屏windows系统默认使用的触控键盘,点击某些输入框时该键盘就会自动弹出。

如果找到位于C:\Program Files\Common Files\microsoft shared\ink下的TabTip.exe并直接双击运行它,键盘就会自动被呼出。相应地,在python中可直接用一行代码实现:

os.system("C:\\PROGRA~1\\COMMON~1\\MICROS~1\\ink\\tabtip.exe")

看上去好像很简单,然而如果再次双击TabTip.exe就会发现键盘并没有关闭。同时如果先点击键盘右上角的小叉,将键盘关闭,再双击TabTip.exe,键盘也并不会弹出。此时打开任务管理器,会发现里面多了一个进程:

Python调用windows系统自带触控键盘TabTip.exe

只有将其结束后再次双击TabTip键盘才会弹出,这并不符合想要灵活打开/关闭的需求。那么究竟才能如何完全掌控TabTip.exe呢?

笔者没有找到任何关于它的官方文档,经过一番搜索后终于在一篇帖子里发现了一位大佬探索出来的可以自由开闭TabTip的机制,即:

为接口ITipInvocation创建一个实例并调用其Toggle(HWND)方法,其中HWND应为当前桌面窗口。

 三、实现

1. Python实现

上面的帖子里只给出了C以及C#的实现。在这篇帖子中一位大佬给出了python的实现,方法略有不同,不过效果相同:

import win32gui
from ctypes import HRESULT
from ctypes.wintypes import HWND
from comtypes import IUnknown, GUID, COMMETHOD
import comtypes.client

class ITipInvocation(IUnknown):
    _iid_ = GUID("{37c994e7-432b-4834-a2f7-dce1f13b834b}")
    _methods_ = [
        COMMETHOD([], HRESULT, "Toggle",
                  ( ['in'], HWND, "hwndDesktop" )
                  )
        ]

dtwin = win32gui.GetDesktopWindow();
ctsdk = comtypes.client.CreateObject("{4ce576fa-83dc-4F88-951c-9d0782b4e376}", interface=ITipInvocation)
ctsdk.Toggle(dtwin);
comtypes.CoUninitialize()

此段代码可以实现键盘的“勾选”式呼出,即每次运行时若键盘未打开则打开,若已打开则关闭。不过前提是TabTip进程必须已经在运行,否则会出现报错:

OSError: [WinError -2147221164] Class not registered

对此,可以先catch该exception后再运行TabTip.exe,即可保证每次TabTip已在运行。

2. 输入框绑定

接下来将该过程绑定到LineEdit输入框上。正常情况下应该有两种做法:

  1. 用installEventFilter给输入框安装一个eventFilter,在eventFilter()中拦截MouseButtonRelease事件,然后再做相应的处理;
  2. 继承QLineEdit类,在子类中重写mousePressEvent()函数。

个人感觉这两种方法都比较麻烦,此时python的好处就体现出来了,这里可以直接把LineEdit的mousePressEvent()函数用我们自己的方法给替换掉,因为python中万物皆是对象,函数也不例外!

3. 代码示例

下面的代码用PySide2做了一个带有LineEdit的小窗口用作展示,将LineEdit的mousePressEvent()函数用替换为了自定义的键盘呼出函数popup_keyboard():

from PySide2.QtCore import *
from PySide2.QtWidgets import *
import sys

import win32gui
from ctypes import HRESULT
from ctypes.wintypes import HWND
from comtypes import IUnknown, GUID, COMMETHOD
import comtypes.client
import os


def popup_keyboard(a):
    toggle_tabtip()
    a.accept()


class ITipInvocation(IUnknown):
    _iid_ = GUID("{37c994e7-432b-4834-a2f7-dce1f13b834b}")
    _methods_ = [COMMETHOD([], HRESULT, "Toggle", (['in'], HWND, "hwndDesktop"))]


def toggle_tabtip():
    try:
        comtypes.CoInitialize()
        ctsdk = comtypes.client.CreateObject("{4ce576fa-83dc-4F88-951c-9d0782b4e376}", interface=ITipInvocation)
        ctsdk.Toggle(win32gui.GetDesktopWindow())
        comtypes.CoUninitialize()
    except OSError as e:
        os.system("C:\\PROGRA~1\\COMMON~1\\MICROS~1\\ink\\tabtip.exe")


class TabTipDemo(QMainWindow):
    def __init__(self):
        super(TabTipDemo, self).__init__()
        self.setObjectName("TabTipDemo")
        self.resize(253, 159)
        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit.setGeometry(QRect(50, 60, 151, 31))
        self.lineEdit.mousePressEvent = popup_keyboard
        self.setCentralWidget(self.centralwidget)
        self.show()


app = QApplication(sys.argv)
win = TabTipDemo()
app.exec_()

代码运行效果如开头动图所示。

四、小结

本文实现了在Pyqt/PySide中点击输入框自动弹出触控键盘的功能。Pyqt/PySide目前多被用于开发一些简单的小软件,因此多数时候不会出现一些很复杂的需求,遇到复杂问题经常会找不到解决方法。同时windows的COM编程也是一门大学问,而官方的文档也没有Python版本的,这对使用python开发中大型桌面应用的开发者来说无疑是一个挑战。文章来源地址https://www.toymoban.com/news/detail-498755.html

到了这里,关于Python调用windows系统自带触控键盘TabTip.exe的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Moonlight-Android修改版(本地鼠标+原生多点触控+键盘快捷键支持+触摸板键盘支持)

    我是用的小新padpro12.7串流的,不知道是不是设备原因,串流用平板外接的鼠标操作非常迟缓,在网上找了很久没有解决的办法(有人说用usb映射可以但是似乎必须是有线鼠标,这样出门太麻烦了)。后面在酷安找到了一位老哥的改版小米平板 HyperOS触控键盘逻辑分析优化以及

    2024年04月09日
    浏览(126)
  • 树莓派安装虚拟键盘,解决虚拟键盘乱码问题,解决MIPI DSI触摸屏触控漂移问题

    当我们买了触摸屏后,会发现没有键盘,还是无法输入,因此需要虚拟键盘 如果你的语言和地区是中文,那么安装虚拟键盘后可能显示乱码,所以还需要安装中文字体 安装完后,重启一下。重启后会发现系统的字体都变得清晰了,并且在菜单-附件中,会找到Keyboard 点击虚拟

    2024年02月09日
    浏览(54)
  • 系统资源监控-Windows自带资源监控

    在性能测试过程中,往往需要对系统应用服务器,数据库服务器等服务端资源使用情况进行监控,以获取服务器性能数据,协助判断服务器性能是否满足性能需求;对于不同的服务器类型,监控服务器的方式也不尽相同,本篇我们主要来讲解对于Winsows 系的服务器的资源数据

    2024年02月09日
    浏览(50)
  • 系统性能监控-Windows自带性能监控器

    在性能测试过程中,往往需要对系统应用服务器,数据库服务器等服务端资源使用情况进行监控,以获取服务器性能数据,协助判断服务器性能是否满足性能需求;对于不同的服务器类型,监控服务器的方式也不尽相同,本篇我们主要来讲解对于Winsows 系的服务器的性能数据

    2024年02月10日
    浏览(45)
  • 使用windows系统自带的远程桌面连接怎么设置?

    windows系统自带的远程桌面连接相对市面上其他的远程软件而言有他的优点: 免费 连接稳定 操作流畅,几乎没有远程办公的卡滞感 但是,唯一的缺点是连接的电脑之间必须使用一个局域网,也就是说比较适合校园、企业用户。以校园为例进行讲解。 连接及被连接电脑都连接

    2024年02月08日
    浏览(48)
  • OCR - 微软windows 11系统自带的Windows OCR功能初体验

    一、Power Automate简述         最近再了解一些ocr的相关信息,从一些网站上上看到微软的免费系统实用工具套件中包含ocr识别/pdf文本提取等。         什么是Power Automate?        Windows 11 允许用户通过预装的 Power Automate 应用创建自动化。 Power Automate 是一个低代码平台,

    2024年02月05日
    浏览(54)
  • 带你启用window10专业版系统自带的远程桌面

    Windows操作系统作为应用最广泛的个人电脑操作系统,在我们身边几乎随处可见。虽然近些年因手机、平板电脑等设备的兴起,个人电脑的存在感逐渐降低,但对于一些大型程序和特殊情况(办公软件、大型游戏、视频剪辑甚至老家家人用等情况),还是需要依靠个人电脑来完

    2024年02月11日
    浏览(46)
  • Windows 自带的 Linux 子系统(WSL)安装与使用

    WSL官网安装教程: https://learn.microsoft.com/zh-cn/windows/wsl/install Windows 自带的Linux子系统,比用VM什么的香太多了。可以自己看官方教程,也可以以下步骤完成。 如果中间遇到我没遇到的问题百度,可以在评论区评论,或者自己百度其他教程解决。 搜索powerShell, 然后右键以管理

    2024年02月21日
    浏览(53)
  • 使用Windows系统自带的安全加密解密文件操作步骤详解

    原以为安全加密的方法是加密压缩包,有的需要用软件加密文件,可每次想往里面修改或存放文件都要先解密,不用时,还得去加密,操作步骤那么多,那多不方便呀,这里讲讲用系统自带的BitLocker加密工具怎么做。 原以为系统自带的 BitLocker 只能加密计算机的硬盘,那怎样

    2024年02月03日
    浏览(48)
  • windows11开启系统自带安卓虚拟机并安装apk包

    本文记录了Windows11系统下开启系统自带的安卓虚拟机,并通过安装包安装自定义应用的过程。开启系统自带的安卓虚拟机流程为:开启Hyper-V、安装Windows11子系统;安装apk安装包的流程为:安装adb调试工具、开启子系统的开发者模式、安装apk应用包。 1 开启Hyper-V Hyper-V是微软的

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包