我正在使用X库编写C应用程序。我想禁用键盘,当用户输入密码时,键盘将被启用。简单地说,我想通过密码在禁用和启用键盘之间切换。
例如,当程序运行时,用户可以按键但不起作用,当用户键入“密码”字时,程序取消键盘并让用户按键,但当用户再次键入时“密码“word键盘将再次被禁用。
我有第一部分,禁用键盘并在用户输入密码时启用它,但我不能以相反的方式执行。
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
bool isBlock = false;
Display *display;
Screen *screen;
Window window;
char password[6];
void order_password(){
for (int i = 0; i < 6; i++){
password[i] = password[i+1];
}
password[6]=0;
}
void handle_event(XEvent event){
KeySym keysym = XKeycodeToKeysym(display, event.xkey.keycode,0);
char str[1];
if (event.type == KeyReleaseMask){
int len = strlen(password);
if (len == 6){
order_password();
}
len = strlen(password);
XLookupString(&event.xkey,str,1,NULL,NULL);
password[len] = str[0];
if (strcmp(password, "hello") == 0){
if (isBlock == false){
memset(&password, 0, sizeof(password));
block();
}else{
memset(&password, 0, sizeof(password));
unblock();
}
}
}
}
void block(){
isBlock = true;
XGrabKeyboard(display, window,true, GrabModeAsync, GrabModeAsync, CurrentTime);
XEvent event;
while (1){
XNextEvent(display, &event);
std::cout << "You can't type anything" << std::endl;
XAllowEvents(display, AsyncKeyboard, CurrentTime);
XAllowEvents(display, AsyncPointer, CurrentTime);
handle_event(event);
}
}
void unblock(){
isBlock = false;
XUngrabKeyboard(display, CurrentTime);
XEvent event;
while (1){
XNextEvent(display, &event);
XSendEvent(display,window,true, 0, &event);
std::cout << "Now, you can type" << std::endl;
XAllowEvents(display, AsyncKeyboard, CurrentTime);
XAllowEvents(display, AsyncPointer, CurrentTime);
handle_event(event);
}
}
int main(int argc,char **argv){
display = XOpenDisplay(NULL);
screen = ScreenOfDisplay(display, 0);
window = DefaultRootWindow(display);
isBlock = false;
if (isBlock == false){
block();
}
}
所以,使用这段代码我开始禁用键盘,当用户输入“hello”字样时,键盘再次启用。现在我想再次禁用它,如果用户输入“你好”字。
注意:密码存储为固定大小的循环列表(本例中为6)。当用户输入“h”时,“h”存储在密码[0]变量中,当用户输入“e”时,“e”存储在密码[1]变量中。当用户下次按键时,当大小为6(例如“Hello w”)时,第一个“H”消失,如果用户现在按“o”密码变量的内容将是“ello wo”