系统相关
首页 > 系统相关> > 我如何制作Windows的T9风格的屏幕键盘?

我如何制作Windows的T9风格的屏幕键盘?

作者:互联网

有时在晚上,我喜欢在床上看电影或在线看电视节目.这很方便,因为我的计算机就在我的桌子旁边,所以我只需旋转一个显示器,禁用另一个屏幕,然后将鼠标移到上方.如果我第二天回到办公桌前无法重新布线,则键盘无法完全触及.有时,当我在看电影时,我的朋友们试图和我说话,而我希望能够不回跳而回头,不需旋转显示器,就可以将鼠标移回并再次坐在椅子上.

我想做的是制作一个可以与鼠标一起使用的屏幕键盘-但采用T9电话键盘样式(希望)最大程度地减少了单击次数,并且使鼠标四处移动,从而减少了目标.我想用Python来做这件事,因为我已经很熟悉这种语言了,但是我不确定从哪里开始.

我不确定的一件事是如何单击屏幕键盘,而不会从聊天窗口中窃取焦点.能做到吗?还是应用程序可以记住上一个聚焦窗口中的上一个聚焦控件并将键击发送给它?

另外,我是否需要外部库来执行此窗口管理和击键发送?

非常感谢您的帮助,如果这样的事情已经存在(使用任何语言),请向我指出.

如果开发的时候,我肯定会开源,并在此处发布项目链接,以防其他人觉得这种事情有用:)

解决方法:

大约12年前,我编写了一个Windows程序,该程序位于托盘中,当它们获得焦点时会将击键发送到某些窗口.我不再需要代码,而我忘记了所有细节.

尽管如此,该过程仍将像这样工作.

对于您的GUI,如果使用Python,则可能要使用PyQT或wxPython.这两个库都使编写GUI应用程序变得容易(尽管您可以直接使用Windows API).

但是,如果是我,我将推迟GUI编程并使用PythonWin.使用其GUI工具(源代码中有很多示例)来创建一个简单的对话框(也是一个Window)来进行事件处理.

您的应用程序可能有两种选择目标窗口的方法.虚拟键盘窗口可能必须窃取焦点(以接收鼠标事件),但是随后它将需要知道将击键发送到哪个窗口.

>您可以在对话框中有一个下拉控件,用于选择目标窗口(您可以轻松获取每个窗口的标题以进行目标选择),或者
>当窗口获得焦点时(可以捕获一个事件,如WM_FOCUS),您可以查询最后一个具有焦点的窗口,也可以keep tabs on which windows have focus并使用您注意到的最后一个窗口.

无论哪种情况,一旦有了目标窗口的句柄,就可以使用SendMessage将击键发送到目标窗口.我建议一开始只是中继常规按键,然后再担心捕获鼠标单击.

编辑我能够将它们拼凑在一起,以便将击键发送到另一个窗口.

import win32ui
import win32con
import time
from ctypes import *

PUL = POINTER(c_ulong)
class KeyBdInput(Structure):
    _fields_ = [("wVk", c_ushort),
                ("wScan", c_ushort),
                ("dwFlags", c_ulong),
                ("time", c_ulong),
                ("dwExtraInfo", PUL)]

class HardwareInput(Structure):
    _fields_ = [("uMsg", c_ulong),
                ("wParamL", c_short),
                ("wParamH", c_ushort)]

class MouseInput(Structure):
    _fields_ = [("dx", c_long),
                ("dy", c_long),
                ("mouseData", c_ulong),
                ("dwFlags", c_ulong),
                ("time",c_ulong),
                ("dwExtraInfo", PUL)]

class Input_I(Union):
    _fields_ = [("ki", KeyBdInput),
                 ("mi", MouseInput),
                 ("hi", HardwareInput)]

class Input(Structure):
    _fields_ = [("type", c_ulong),
                ("ii", Input_I)]

def send_char(char):
    FInputs = Input * 1
    extra = c_ulong(0)
    ii_ = Input_I()
    KEYEVENTF_UNICODE = 0x4
    ii_.ki = KeyBdInput( 0, ord(char), KEYEVENTF_UNICODE, 0, pointer(extra) )
    x = FInputs( ( 1, ii_ ) )
    windll.user32.SendInput(1, pointer(x), sizeof(x[0]))

if __name__ == '__main__':
    wnd = win32ui.FindWindow(None, '* Untitled - Notepad2 (Administrator)')
    type_this = 'jaraco'
    wnd.SetFocus()
    wnd.SetForegroundWindow()
    for char in type_this:
        send_char(char)

我发现PostMessage技术不能很好地工作(我无法完全使用它).

我也在identifying the last active window上找到了这篇文章.

标签:soft-keyboard,windows,python,windows-7
来源: https://codeday.me/bug/20191209/2098042.html