⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autotype_x11.cpp

📁 KeePassX用于保护密码的安全
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 /*************************************************************************** *   Copyright (C) 2005-2006 by Tarek Saidi                                * *   tarek.saidi@arcor.de                                                  * *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * *   This program is distributed in the hope that it will be useful,       * *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * *   GNU General Public License for more details.                          * *                                                                         * *   You should have received a copy of the GNU General Public License     * *   along with this program; if not, write to the                         * *   Free Software Foundation, Inc.,                                       * *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             * ***************************************************************************/#include <QApplication>#include "AutoType.h"#include <QTime>#include <QList>#include <QChar>QWidget* AutoType::MainWin=NULL; #ifdef Q_WS_X11int AutoType::getModifiers(Display *d,KeySym keysym, int keycode){int SymsPerKey;KeySym* Syms=XGetKeyboardMapping(d,keycode,1,&SymsPerKey);int c=-1;for(int i=0;i<4;i++)	if(Syms[i]==keysym){		c=i; break;}Q_ASSERT(c!=-1);XFree(Syms);return c;}void AutoType::releaseModifiers(Display* d,int mods){pressModifiers(d,mods,False);}void AutoType::pressModifiers(Display* d,int mods,bool press){int keycode;switch(mods){	case 0: //no modifier			break;	case 1: //Shift			XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2);			break;	case 2: //AltGr			XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2);			break;	case 3: //Shift+AltGr			XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2);			XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2);			break;}}void AutoType::perform(CEntry* entry, QString& err){struct timespec timeOut,remains;timeOut.tv_sec = 0;timeOut.tv_nsec = 300000000; /* 300 milliseconds */for(int i=0;i<10;i++)nanosleep(&timeOut, &remains);QString str;int c=entry->Additional.count("Auto-Type:");if(c>1){	err=tr("More than one 'Auto-Type:' key sequence found.\nAllowed is only one per entry.");	return;}if(c==1){	int start=entry->Additional.indexOf("Auto-Type:")+10;	int len;	if(entry->Additional.size()==10)return;	for(len=0;len<entry->Additional.size();len++){		if(entry->Additional.size()==(start+len))break;		if(entry->Additional.at(start+len)==QChar('\n'))break;}	if(!len)return;	str=entry->Additional.mid(start,len);}else	str="{USERNAME}{TAB}{PASSWORD}{ENTER}";QList<quint16> Keys;for(int i=0;i<str.size();i++){	if(str[i]=='{'){		int start=i;		QString tmpl;		i++;		while(str[i]!='}' && i<str.size()){			tmpl += str[i];			i++;		}		if(i>=str.size()){			err=tr("Syntax Error in Auto-Type sequence near character %1\n\					Found '{' without closing '}'").arg(i+10);			return;		}		templateToKeysyms(tmpl.toLower(),Keys,entry);		continue;	}	else		Keys << getKeysym(str[i]);}MainWin->hide();Display* pDisplay = XOpenDisplay( NULL );for(int i=0;i<Keys.size();i++){	int keycode=XKeysymToKeycode(pDisplay,Keys[i]);	int mods=getModifiers(pDisplay,Keys[i],keycode);	pressModifiers(pDisplay,mods);	XTestFakeKeyEvent(pDisplay,keycode,True,0);	XTestFakeKeyEvent(pDisplay,keycode,False,1);	releaseModifiers(pDisplay,mods);}XCloseDisplay(pDisplay);MainWin->show();}void AutoType::templateToKeysyms(const QString& tmpl, QList<quint16>& keys,CEntry* entry){//tmpl must be lower case!!!if(!tmpl.compare("title")){	stringToKeysyms(entry->Title,keys);	return;}if(!tmpl.compare("username")){	stringToKeysyms(entry->UserName,keys);	return;}if(!tmpl.compare("url")){	stringToKeysyms(entry->URL,keys);	return;}if(!tmpl.compare("password")){	entry->Password.unlock();	stringToKeysyms(entry->Password.string(),keys);	entry->Password.lock();	return;}if(!tmpl.compare("space")){	keys << getKeysym(' ');	return;}if(!tmpl.compare("backspace") || !tmpl.compare("bs") || !tmpl.compare("bksp")){	keys << XK_BackSpace;	return;}if(!tmpl.compare("break")){	keys << XK_Break;	return;}if(!tmpl.compare("capslock")){	keys << XK_Caps_Lock;	return;}if(!tmpl.compare("del") || !tmpl.compare("delete")){	keys << XK_Delete;	return;}if(!tmpl.compare("end")){	keys << XK_End;	return;}if(!tmpl.compare("enter")){	keys << XK_Return;	return;}if(!tmpl.compare("esc")){	keys << XK_Escape;	return;}if(!tmpl.compare("help")){	keys << XK_Help;	return;}if(!tmpl.compare("home")){	keys << XK_Home;	return;}if(!tmpl.compare("ins")){	keys << XK_Insert;	return;}if(!tmpl.compare("numlock")){	keys << XK_Num_Lock;	return;}if(!tmpl.compare("scroll")){	keys << XK_Scroll_Lock;	return;}if(!tmpl.compare("pgdn")){	keys << XK_Page_Down;	return;}if(!tmpl.compare("pgup")){	keys << XK_Page_Up;	return;}if(!tmpl.compare("prtsc")){	keys << XK_3270_PrintScreen;	return;}if(!tmpl.compare("up")){	keys << XK_Up;	return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -