gpt4 book ai didi

c - 输入密码字段时如何检测

转载 作者:太空狗 更新时间:2023-10-29 15:04:39 25 4
gpt4 key购买 nike

我目前正在尝试调试我在使用程序“matchbox-keyboard”(http://matchbox-project.org/) 时遇到的问题,希望得到一些帮助。 matchbox-keyboard 是我目前在触摸屏亭中使用的屏幕键盘,允许用户输入一些基本输入以进行搜索等。它可能有点旧,但它仍然是我的应用程序的理想选择,因为它是“按需”键盘(即它只在需要时出现),重量轻,并且与我在设备上使用的 matchbox-window-manager 配合得很好。但是,信息亭必须访问的站点之一要求用户临时登录,并且出于某种原因,每当用户点击密码字段时,屏幕键盘就会消失。

用户必须访问的站点无法更改,因此我决定自己尝试修补 matchbox-keyboard 以更改此行为。为此,我将问题追溯到代码中定义的自定义 Atom,如下所示

typedef enum {
MBKeyboardRemoteNone = 0,
MBKeyboardRemoteShow,
MBKeyboardRemoteHide,
MBKeyboardRemoteToggle,
} MBKeyboardRemoteOperation;

=============

void
mb_kbd_remote_init (MBKeyboardUI *ui)
{
Atom_MB_IM_INVOKER_COMMAND = XInternAtom(mb_kbd_ui_x_display(ui),
"_MB_IM_INVOKER_COMMAND", False);
}

然后在 Xevent 中检查此 Atom,然后使用来自 xevent (xevent->xclient.data.l[0]) 的数据来确定将键盘置于何种状态. 我想不通的是 X 显示如何知道 Xevent 何时应该是 '_MB_IM_INVOKER_COMMAND' 类型,以及它如何实际设置数据值。具体来说,当我输入密码字段时,它如何/为什么将 xevent->xclient.data.l[0] 的值设置为 2 (MBKeyboardRemoteHide)。

我已尝试在代码中搜索对此处提到的关键对象的引用,并从此处的指南中阅读 Xlib 事件:http://tronche.com/gui/x/xlib/events/ ,并在谷歌上搜索答案,但老实说,这只是我的头,我无法解决这个问题。在这一点上,它已经从我的售货亭项目的必要性变成了我的好奇心(并且在我弄清楚之前会让我发疯),所以如果有人能帮我得到一些答案,我会非常感谢。

==========更新==========

进一步测试/信息:

这个问题似乎不是特定于浏览器实现的,因为我尝试了我想要的网站,以及一个只有文本和密码字段的基本测试 HTML 页面,在 gecko 浏览器 (Firefox) 上,以及一个webkit 浏览器(Midori),在两个浏览器中,在两个页面上,行为是相同的。这是供引用的测试 HTML 页面:

<head>
</head>
<body>
<form>
Name: <input type="text" name="firstname"><br>
PW: <input type="password" name="lastname">
</form>
</body>
</html>

在我看来,密码字段出于某种原因故意拒绝焦点,因此直接单击该字段会导致调用 gtk-im 方法 focus-out。我怀疑它可能是 GTK 实现的一部分,可能与密码字段通常被“隐藏”的行为有关。也许这样做是为了防止按需剪贴板存储密码或类似的东西?

在检查单击密码字段和文本字段的事件列表/调试输出时,每个字段类型的接收事件列表非常相似。许多事件都是同一类型,但它们之间存在一些差异,我仍在尝试对其进行解码。我知道事件编号在这种情况下大多没有意义,但为了说明,这里是非密码字段的不同事件列表:

matchbox-keyboard-remote.c:47,mb_kbd_remote_process_xevents() got a message of type _MB_IM_INVOKER_COMMAND, val 1
matchbox-keyboard-ui.c:560,mb_kbd_ui_redraw() mark
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 37748776
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651629
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018

密码字段:

matchbox-keyboard-remote.c:47,mb_kbd_remote_process_xevents() got a message of type _MB_IM_INVOKER_COMMAND, val 2
matchbox-keyboard-ui.c:1230,mb_kbd_ui_event_loop() Hide timed out, calling mb_kbd_ui_hide
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35665943
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 39845918
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651629
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433

不幸的是,这是我目前得到的最好的信息,因为我的 C 技能很生疏。

最佳答案

matchbox-keyboard 安装一个 GTK 输入法(见 gtk-im 目录)。这负责将消息发送到键盘。

当前,当输入法被告知焦点已移除时,它会发送此 MBKeyboardRemoteHide 命令(请参阅 gtk-im/im-context.c)。

XEvent 而言,处理这只是一个 ClientMessage,它允许客户端使用他们自己的“协议(protocol)”在它们之间进行通信。

我无法解释的是,为什么当您单击密码字段时没有调用 focus_in vfunc。这可能是浏览器实现的一部分或 GtkIMContext 问题。

关于c - 输入密码字段时如何检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com