被朋友彻底恶作剧了一把……来了个简单的VB设计的小软件,前面就是一些问题加选项没什么……到最后当你点下一步后就弹出个对话框:
我当时丝毫没有怀疑是这个小软件造成的,以为是电脑某处**了!(按自我的常识理解,微软怎么可能允许软件可调用强制关机这种功能!!)到后来才知道……原来是真的……
吃一堑长一智吧。于是自己就花了点时间研究了下这个“恶作剧软件”,发现它竟然是这么的简单!!
首先,不管别的那些个铺垫功能,这都是用来让你放松警惕的,设计上可以充分发挥大家的想象力~
我们直接看看强制关机部分的实现,其实在我们C盘里面就有一个强制关机的exe:
所以,只要我们调用这个exe就可以了~
下面我用VC试了试这样的方法。先建了个对话框的工程,加了个按键“shutdown”,按键单击处理函数如下:
void CShutdownDlg::OnClickedButtonShutdown()
{
// TODO: 在此添加控件通知处理程序代码
FILE *f;
if(f=fopen("c:\\windows\\system32\\shutdown.exe","r"))
system("c:\\windows\\system32\\shutdown.exe -s -t 30");//30秒以后关机
fclose(f);
}
shutdown.exe有着很多的参数,比如上面用到了-s和-t,作用就是强制关机和关机时间设定,单位是秒。另外的一些的参数如下:
-f:强行关闭应用程序
-m \\计算机名:控制远程计算机
-i:显示图形用户界面,但必须是Shutdown的第一个选项
-l:注销当前用户
-r:关机并重启
-t 时间:设置关机倒计时
-c "消息内容":输入关机对话框中的消息内容(不能超127个字符)
这里还要重点介绍下另一个参数-a——取消关机操作,在调试的时候这个很有用,毕竟总不能我们自己试的时候要频繁关机了~
void CShutdownDlg::OnClickedButtonCancel()
{
// TODO: 在此添加控件通知处理程序代码
FILE *f;
if(f=fopen("c:\\windows\\system32\\shutdown.exe","r"))
system("c:\\windows\\system32\\shutdown.exe -a");//取消注销关机
fclose(f);
}
通过上面的部分可以看出,其实Windows操作系统里,exe也是一种文件,我们可以通过对文件操作的方式来控制exe的运行,个人的一点感觉就是,好比我们数字电路处理数据时,不管是什么样的数据形式,其实都是一段二进制码流;在操作系统中也是一样的,不管是什么样的格式,其实都是数据文件。
之后,自己又在网上找了找别的“恶作剧软件”发现还真是层出不穷,大家有兴趣也可以找找看。
自己想到一个算是比较有用的“恶作剧”——让鼠标消失不见!
个人想到的有两种实现方法,一是将鼠标功能关闭;二是让鼠标一直停在我们看不到的地方。这里采用第二种方法,这样稍微简单一些。
让鼠标停在我们看不到的地方就得先确定,哪里是我们看不到的地方?自己试试就会发现,在下边界和右边界的时候,我们人眼是看不到的。这样就简单了。代码如下:
void CShutdownDlg::OnClickedButtonMouse()
{
// TODO: 在此添加控件通知处理程序代码
CPoint mouse_position;
tagMSG msg;
mouse_position.x = 0;
mouse_position.y = 65535;
while (1)
{
::SetCursorPos(mouse_position.x,mouse_position.y);//设定鼠标所在位置
if(::PeekMessage(&msg, m_hWnd, WM_KEYFIRST,WM_KEYLAST, PM_REMOVE))
//获取键盘按下事件响应
{
if(msg.message == WM_KEYDOWN && msg.wParam == VK_UP)
//判断是否是“向上”按键按下
break;
}
}
}
这里同样是用了一个按钮响应函数来实现。首先,SetCursorPos这个函数就是用来设定鼠标的位置,我们可以通过试验来看看放在哪个坐标位置时是我们看不见的,对于屏幕来说,左上角的顶点是坐标(0,0),所有坐标都是正数。
如上,凡事都不能做死了,必须留有后路。于是就在死循环里加了一个break的判定,当键盘按下“UP”键的时候,就退出死循环。如果要作为一个“恶作剧”的话,这个键值可以改成别的,这样不容易被人发现,呵呵~
用户1696769 2012-9-29 15:14
用户1567315 2012-9-20 16:55