Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在输入密码字段时进行检测_C_Unix_Xlib - Fatal编程技术网

C 如何在输入密码字段时进行检测

C 如何在输入密码字段时进行检测,c,unix,xlib,C,Unix,Xlib,我目前正试图调试“火柴盒键盘”程序遇到的一个问题(http://matchbox-project.org/),我希望能得到一些帮助。火柴盒键盘是一种屏幕上的键盘,我目前在触摸屏信息亭中使用它,允许用户输入一些基本输入来进行搜索等。它可能有点旧,但它非常适合我的应用程序,因为它是一种“按需”键盘(即,它只在需要时出现),重量轻,并且与我在设备上使用的火柴盒窗口管理器配合良好。但是,信息亭必须访问的站点之一要求用户临时登录,并且由于某种原因,每当用户单击密码字段时,屏幕上的键盘就会消失 用户必须访问

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

用户必须访问的站点无法更改,因此我决定尝试修补火柴盒键盘以更改此行为。为此,我将问题追溯到代码中定义的自定义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);
}
然后在Xevents中检查此原子,然后使用来自xevent的数据(
xevent->xclient.data.l[0]
)确定将键盘置于何种状态。我不明白的是,X显示器如何知道Xevent何时应该是“_MB_IM_INVOKER_COMMAND”类型,以及它如何实际设置数据值。具体来说,当我输入密码字段时,它如何/为什么将
xevent->xclient.data.l[0]
的值设置为2(
MBKeyboardRemoteHide

我曾尝试在代码中搜索此处提到的关键对象的引用,以及阅读此处指南中的Xlib事件:,并在google上搜索答案,但老实说,这有点让我不知所措,我无法掌握这个问题。在这一点上,它已经从我的信息亭项目的必要性,并成为我的好奇心更大的一部分(这将使我发疯,直到我找到它),所以如果有人可以帮助我得到一些答案,我将非常感激

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

void
mb_kbd_remote_init (MBKeyboardUI *ui)
{
  Atom_MB_IM_INVOKER_COMMAND = XInternAtom(mb_kbd_ui_x_display(ui), 
                       "_MB_IM_INVOKER_COMMAND", False);
}
进一步测试/信息:


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

和密码字段:

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语言技能已经相当生疏。

火柴盒键盘安装了GTK输入法(请参阅GTK im目录)。它负责将消息发送到键盘

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

XEvent
处理而言,这只是一个
ClientMessage
,它允许客户机使用自己的“协议”相互通信


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

问题似乎不是特定于浏览器实现的,因为我尝试了我想要的网站,以及gecko浏览器(Firefox)和webkit浏览器(Midori)上只有文本和密码字段的基本测试HTML页面,并且在这两种浏览器中,在这两个页面上,行为是相同的。编辑我的问题以包含更多信息。