Qt———锁屏

这几天的需求是做一个锁屏,对于一个Qt工作者来说,可能就是一会儿的事,但是我也是刚开始接触,所以花的时间多了些,现在来说下思路。
锁屏嘛,就是当输入密码后点击锁屏后就锁屏,然后屏蔽任务管理器(暂未实现),输入密码后判断和之前的密码对不对,对的话就锁屏,错的话就不管。

首先,我把所有的控件全部都写在一个weight中,为什么了?因为两个页面的跳转还不会,所以就先全部写进来,然后hide()隐藏。
键盘的输入调用的是KeyBoardProc

LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam)
{
	if (code == HC_ACTION)
	{
		PKBDLLHOOKSTRUCT p;

		switch (wParam)
		{
		case WM_KEYDOWN:
		case WM_SYSKEYDOWN:
		case WM_KEYUP:
		case WM_SYSKEYUP:
			p = (PKBDLLHOOKSTRUCT)lParam;
			if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU) && GetAsyncKeyState(VK_DELETE))
			{
				while (1)//死循环,因为我们不知道windows何时会弹出,所以给死循环
				{
					f = FindWindow(NULL, _T("Windows 任务管理器"));
					GetWindowThreadProcessId(f, &ID1);
					pid1 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ID1);
					if (TerminateProcess(pid1, NULL))
					{
						qtimer2 = 0;
						return 0;//屏蔽之后退出
					}

				}
			}
			if (((LOWORD(lParam) & VK_CONTROL) != 0) && (((LOWORD(lParam) & VK_MENU) != 0)) && (HIWORD(lParam) == VK_DELETE) || GetAsyncKeyState(VK_CONTROL)<0 || (p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0) || (p->vkCode == VK_F4) && ((p->flags & LLKHF_ALTDOWN) != 0) || (p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0) || (p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN) || ((p->flags & LLKHF_ALTDOWN) != 0) || ((p->flags & LLKHF_ALTDOWN) != 0))  //left win or right win
			//if (WM_SYSKEYDOWN == pMsg->message // WM_SYSKEYDOWN  表示ALT键按下   && VK_F4 == pMsg->wParam)
			{
				//qDebug() << "按键";
				return 1;
			}

			break;
		}

	}

	return ::CallNextHookEx(g_hKey, code, wParam, lParam);
}

void LOCKQ::SetHook()
{
	g_hKey = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc, GetModuleHandle(NULL), 0);
}

void LOCKQ::UnSetHook()
{
	UnhookWindowsHookEx(g_hKey);
}

lineedit获取文本直接用的是

str1=u1.password1->text();

如果两次输入密码一样,则将隐藏的frame显示出来,然后将现在的frame hide()掉,如果两次输入的密码不一样,则将当前的文本设置成红色,透明背景无边框。

		u1.password1->setStyleSheet("background-image:url(:/QLock/Resources/bk/null.png);color:red;background:transparent;border-width:0;border-style:outset;");
		u1.password2->setStyleSheet("background-image:url(:/QLock/Resources/bk/null.png);color:red;background:transparent;border-width:0;border-style:outset;");

但是当重新输入密码的时候,怎么让lineedit中的字体变成白色呢?用timeout()不行,因为这不是实时刷新的,而是当重新点击这个lineedit时,才会将字体变回原来的颜色,后来查阅Qt5的文档, 采用的是textEdited,

	connect(u1.password1, SIGNAL(textEdited()), this, SLOT(slot_setcolor()));

但是这样的写法又没法达到效果,查阅了无数的资料,但是一无所获,最后采用的是Qt4的写法,

	connect(u1.password2, &QLineEdit::textEdited, this, &LOCKQ::slot_setcolor);

虽然不明白为什么,但是效果起码是实现了,群友给的说法是

“Qt5一旦槽函数有重载,这写法只能用无参数的”

设置焦点在lineedit且响应空格的方法是

	u1.startlock->setShortcut(QKeySequence::InsertParagraphSeparator);
	u1.startlock->setShortcut(Qt::Key_Enter);
	u1.startlock->setShortcut(Qt::Key_Return);

总的来说,Qt就是在信号与槽之间的调用。

以上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值