C++Windows-SDK实战:写一个“不安全的程序”

7 篇文章 0 订阅
2 篇文章 0 订阅

标题中说:不安全的程序。实际上,不是它不安全,而是我们自己制造的一个不安全的情况(或是气氛),是假的,是化学成分的【DUANG~】。
这里需要一点点(对的,只要一点点WindowsSDK的知识。
如果你是初学者,可以用这个实例锻炼一下自己。
如果你是大佬,可以观摩观摩。
好吧,你可能在疑惑。因为“不安全的情况”我说的太抽象,那么一起跟我先看一看最终效果吧!

效果

最终效果分两种,一种是感染病毒

打开后

主窗体
点击右上角关闭键后
之后主窗体保留

没感染病毒

打开后
主窗体
点击关闭后
之后程序正常结束

我的想法

首先,随机生成1或0,赋值给变量。

注册窗口类时,用if语句判断随机生成值决定hIconhIconSm(图标)是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编程的道路上越走越远,越走越好!

对了,记得关注、点赞哦!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值