标题中说:不安全的程序。实际上,不是它不安全,而是我们自己制造的一个不安全的情况(或是气氛),是假的,是化学成分的【DUANG~】。
这里需要一点点(对的,只要一点点)WindowsSDK的知识。
如果你是初学者,可以用这个实例锻炼一下自己。
如果你是大佬,可以观摩观摩。
好吧,你可能在疑惑。因为“不安全的情况”我说的太抽象,那么一起跟我先看一看最终效果吧!
效果
最终效果分两种,一种是感染病毒。
之后主窗体保留
没感染病毒
之后程序正常结束
我的想法
首先,随机生成1或0,赋值给变量。
注册窗口类时,用if语句判断随机生成值决定hIcon
和hIconSm
(图标)是IDI_APPLICATION
(程序图标,正常),还是IDI_ERROR
(异常图标,病毒)。
以及hbrBackground
(背景)是(HBRUSH)GetStockObject(WHITE_BRUSH)
白底,正常还是(HBRUSH)GetStockObject(BLACK_BRUSH)
黑底,被感染
之后,在消息处理函数内判断:
如果窗体创建成功,则报告是否有病毒
(0为假,1为真)
如果在消息是WM_CLOSE
的情况下:
变量=1 重新弹出窗口,并提示无法关闭;
变量=2 关闭窗口,并提示你走运了;
光谈理论是不行的,那么,我们现在就开始编码吧!
开始编程
首先,在编基本的东西(WinMain,消息处理,Include)之前,我们先弄一个头文件,用于随机抽是不是病毒。
//Virus.h
#ifndef VIRUS_H
#define VIRUS_H
#include <stdlib.h>
#include <time.h>
int i;
//随机
void random()
{
srand((unsigned int)time(NULL)); //将随机数种子重新赋值
i=rand()%2; //随机取0~RAND_MAX值,并除以2取余,把数值控制在0~1之间,赋值给i
}
基本的东西大家都会,这边就不多说,开始吧!
//WinMain.cpp
#include <Windows.h>
#include <tchar.h> //为了使用TCHAR类型
#include "Virus.h"
/*
* TCHAR类型适用于UNICODE和ASCII两种编码
* 两种编码的不同自行百度
*/
HINSTANCE hInstanceTemp; //为了存储实例句柄,以后重新弹出窗口要用
LRESULT CALLBACK WinMessageProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
}
//_tWinMain代表其适应两种编码
//源代码如下
/*
* #ifdef UNICODE
* #define _tWinMain wWinMain
* #else
* #define _tWinMain WinMain
* #endif
*/
//同理参数列表中LPTSTR
INT WINAPI _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
INT nCmdShow)
{
WNDCLASS wc;
}
这些相信大家早就滚瓜烂熟了,可能不了解的地方我也打上备注了。
接下来定义、注册窗口类
//(接 WNDCLASS wc;)
hInstanceTemp = hInstance; //保存实例句柄,以后重新弹出主窗体要用
random(); //随机赋值i
wc.cbClsExtra = 0;
wc.cbSize = sizeof(wc);
wc.cbWndExtra = 0;
if (i == 1) //如果有病毒
{
//将背景涂黑
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
//图标为错误(ERROR)图标
wc.hIcon = LoadIcon(NULL, IDI_ERROR);
wc.hIconSm = LoadIcon(NULL, IDI_ERROR);
}
else //没有病毒
{
//将背景涂白
wc.hbrBackground = (HBRUSH)BACKGROUND_BLUE;
//图标为程序(APPLICATION)图标
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
}
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hInstance = hInstance;
wc.lpfnWndProc = WinMessageProc;
wc.lpszClassName = _T("MyWindowClass");
wc.lpszMenuName = NULL;
wc.style = CS_VREDRAW | CS_HREDRAW;
写到这里,我们已经成功赋值完了wc内全部的量,现在去注册它。
if (!RegisterClassEx(&wc)) //如果注册失败
{
//发出提示
MessageBox(NULL, _T("注册失败!"), _T("失败"), MB_OK);
//返回0,结束程序
return 0;
}
怎么样,还挺简单的吧。
那么迎来一个新手最难点之一:
CreateWindow()
HWND MyWindow = CreateWindowEx(0L, _T("MyWindowClass"), _T("不安全的程序"), WS_OVERLAPPEDWINDOW, 0, 0,
400, 400, NULL, NULL, hInstance, NULL);
作为初学者百分之百记不清。
好吧,闲话少说,继续!
if (MyWindow == NULL) //如果创建失败
{
//提示
MessageBox(NULL, _T("弹出窗口失败"), _T("失败"), MB_OK);
//结束程序
return 0;
}
//展示窗口并更新窗口
ShowWindow(MyWindow, nCmdShow);
UpdateWindow(MyWindow);
嗯。。。
我好像把不重要的说多了。
不过,。。。
为了照顾初学者,还是说说吧!(虽然我也是初学者)
//消息循环,没啥好说的
MSG msg;
//如果一直没有收到0(PostQuitMessage函数),循环
while (GetMessage(&msg, NULL, 0, 0))
{
//真没啥好说的
TranslateMessage(&msg);
DispatchMessage(&msg);
}
注意!重头戏来了!
我们要开始编辑消息处理函数了!
//接WinMessageProc
switch (msg) //此处msg是参数列表中的UINT msg
{
case WM_CREATE: //如果创建窗体
TCHAR tcmsg[50]; //消息
wsprintf(tcmsg,"%s%d",_T("这是一个不安全的程序,有病毒
为1,无病毒为0:"),i);
//将提示信息和i存储进总提示信息里,方便发出
MessageBox(NULL,tcmsg,_T("提示"),MB_OK);
return DefWindowsProc(hwnd,msg,wParam,lParam);
//返回消息循环
case WM_CLOSE:
if (i == 1) //如果有病毒
{
//提示并装BI
MessageBox(NULL, _T("你不可能这么简单关掉我"), _T("这是个病毒!"), MB_OK);
//重新创造窗口
hwnd = CreateWindowEx(0L, _T("MyWindowClass"), _T("不安全的程序"), WS_OVERLAPPEDWINDOW, 0, 0,
400, 400, NULL, NULL, hInstanceTemp, NULL);
//上面这里运用到了hInstanceTemp
//注意到了没有
return DefWindowProc(hwnd, msg, wParam, lParam);
//返回消息循环
}
else
{
//提示并装~哔~
MessageBox(NULL, _T("算你走运"), _T("呵呵"), MB_OK);
//发出退出信息:0
PostQuitMessage(0);
return 0;
//记住,本函数返回值是LRESULT
//原文件中讲:
//typedef LONG_PTR LRESULT;
//typedef long LONG_PTR;
//也就是说,LRESULT就是long,长整型
//所以返回一个0
}
}
至此,就编完了!
等一等…
先别编译运行啊!
你忘了“病毒”是怎样的吗?
我先得告诉你怎么关它!
什么,你已经开了?
好吧…
其实,很多大佬早就知道我要说什么了。
也就是用
taskmgr
怎么关闭病毒窗体
首先,摁一下Windows+R
弹开“运行”窗口。
输入:taskmgr。
弹开“任务管理器”窗口。
找到程序,点击结束任务。
怎么样?
此教程结束
教程结束了。
有人可能会问,为什么我不发上来代码文件?
因为我想,大家照着博客里的展示代码就好了。
“标准答案”会限制大家对于程序的想法和想象。
我的程序就不一定是最好的。
你也可以提出建议,和我的PK。
加油!
祝各位在C++ WindowsSDK编程的道路上越走越远,越走越好!
对了,记得关注、点赞哦!