Advertisement

小火箭原理

阅读量:

小火箭原理及实现

本次安全培训计划中的第四项具体环节涉及较多内容。由于时间限制以及项目复杂度较高,在后续工作中可能会忽略一些细节部分。现将本项目的操作逻辑及最终成果进行了简要阐述。

移动原理:该函数用于实现窗体位置的变化操作。我的作品是一个非常简单的"小火箭"形象。如果你希望展示更加复杂的图像,则可以在窗体表面附加其他图形元素,并确保这些图形区域总面积超过窗体区域面积即可。需要注意的是,在操作前请先获取屏幕尺寸信息。

SystemParametersInfo(SPI_GETWORKAREA,0,&rc,0); rc是尺寸。

除此之外也没有值得记录的地方。在本阶段我喜欢使用SDK进行编程工作,在整个过程逻辑清晰且完全自主完成,并且查找与修改的速度非常快。MFC给我带来了类似于QT的强大功能体验,并且迟早会出现类似的问题需要解决

附上源码:

// Win32Project1.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "写你吗.h"
#include <strsafe.h>
#include <TlHelp32.h>
#include <windows.h>
#include <atlstr.h>
#define MAX_LOADSTRING 100
// 获得系统CPU使用率
class CCPUUseRate
{
public:
BOOL Initialize()
{
FILETIME ftIdle, ftKernel, ftUser;
BOOL flag = FALSE;
if (flag = GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
m_fOldCPUIdleTime = FileTimeToDouble(ftIdle);
m_fOldCPUKernelTime = FileTimeToDouble(ftKernel);
m_fOldCPUUserTime = FileTimeToDouble(ftUser);

}
return flag;
}
//调用Initialize后要等待1秒再调用此函数
int GetCPUUseRate()
{
int nCPUUseRate = -1;
FILETIME ftIdle, ftKernel, ftUser;
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
double fCPUIdleTime = FileTimeToDouble(ftIdle);
double fCPUKernelTime = FileTimeToDouble(ftKernel);
double fCPUUserTime = FileTimeToDouble(ftUser);
nCPUUseRate= (int)(100.0 - (fCPUIdleTime - m_fOldCPUIdleTime)
/ (fCPUKernelTime - m_fOldCPUKernelTime + fCPUUserTime - m_fOldCPUUserTime)
*100.0);
if (nCPUUseRate<0)
{
int i = 0;
}
m_fOldCPUIdleTime = fCPUIdleTime;
m_fOldCPUKernelTime = fCPUKernelTime;
m_fOldCPUUserTime = fCPUUserTime;
}
else
MessageBox(0,0,0,0);
return nCPUUseRate;
}
private:
double FileTimeToDouble(FILETIME &filetime)
{
return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;
}
private:
double m_fOldCPUIdleTime;
double m_fOldCPUKernelTime;
double m_fOldCPUUserTime;
};
// 全局变量:
DWORD t,d;
RECT rc;
HBITMAP g_hbitmap;
BITMAP Bmp; //BITMAP是结构体
HDC hDc,hDcMem; //hDcMen兼容设备
HINSTANCE hInst; // 当前实例
INT_PTR CALLBACK DialogProc( //主界面
In HWND hwndDlg,
In UINT uMsg,
In WPARAM wParam,
In LPARAM lParam
);
INT_PTR CALLBACK DialoRocket(
In HWND hwndDlg,
In UINT uMsg,
In WPARAM wParam,
In LPARAM lParam
)
{

switch (uMsg)

HANDLE hProcessSnap; // 进程快照句柄
HANDLE hProcess; // 进程句柄
PROCESSENTRY32 StcPe32 = {0}; // 进程快照信息
StcPe32.dwSize = sizeof(PROCESSENTRY32);
// 创建进程相关的快照句柄
hProcessSnap= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (!hProcessSnap)
{
return 0;
}
// 通过进程快照句柄获取第一个进程信息
if (!Process32First(hProcessSnap,&StcPe32))
{
CloseHandle( hProcessSnap);
return 0;
}
MEMORYSTATUS memStatus1;
GlobalMemoryStatus(&memStatus1);
DWORD t = memStatus1.dwMemoryLoad;
do
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION,FALSE,StcPe32.th32ProcessID);
if (hProcess!=0)
SetProcessWorkingSetSize(hProcess,-1,-1);
} while(Process32Next(hProcessSnap,&StcPe32));
MEMORYSTATUS memStatus;
GlobalMemoryStatus(&memStatus);
DWORD d = memStatus.dwMemoryLoad;
}break;
case WM_LBUTTONUP:
{
SetTimer(hwndDlg,1,100,0);
}
default:
break;
}
return 0;
}
HINSTANCE g_hInstance;
int APIENTRY _tWinMain(In HINSTANCE hInstance,
In_opt HINSTANCE hPrevInstance,
In LPTSTR lpCmdLine,
In int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

将g_hInstance初始化为hInstance。
调用一个名为DialogBox的函数,并传递三个参数:第一个参数是hInstance变量;第二个参数是字符串ID IDD_DIALOG1;第三个参数是空值NULL;第四个参数是函数名称DialogProc。
返回整数值0。
}

//主对话框
DialogProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
当消息为WM_TIMER时:
{
HWND H_cpu = GetDlgItem(hwndDlg,IDC_cpu);
HWND H_memory = GetDlgItem(hwndDlg,IDC_neicun);
CCPUUseRate obj;
obj.Initialize();
HANDLE hEvent = CreateEvent (NULL,FALSE,FALSE,NULL);
WaitForSingleObject(hEvent,300); //等待500毫秒
int i = obj.GetCPUUseRate();
CString strCpu;
strCpu.Format(L"CPU占用:%d%%",i);
SetWindowText(H_cpu,strCpu);
}
}

MEMORYSTATUS memStatus;
GlobalMemoryStatus(&memStatus);
CString strmemy;
strmemy.Format(L"内存占用:%d%%",memStatus.dwMemoryLoad);
SetWindowText(H_memory,strmemy);
}break;
case WM_INITDIALOG:
{
HWND H_cpu = GetDlgItem(hwndDlg,IDC_cpu);
HWND H_memory = GetDlgItem(hwndDlg,IDC_neicun);
SetWindowText(H_cpu,L"CPU占用:10000%");
SetWindowText(H_memory,L"内存占用:20000%");
SetTimer(hwndDlg,2,1000,0);
}break;
case WM_MOUSEMOVE:
{
SystemParametersInfo(SPI_GETWORKAREA,0,&rc,0);
ShowWindow(hwndDlg,SW_HIDE);
KillTimer(hwndDlg,2);
HWND hWnd = CreateDialog(g_hInstance,(LPCTSTR)IDD_DIALOG2,hwndDlg,DialoRocket);
MoveWindow(hWnd,rc.right-100,rc.bottom-150,100,150,1);

// 使用LoadBitmap函数加载名为IDB_BITMAP2的位图为g_hInstance变量
// 通过GetObject函数获取该位图的尺寸信息
// 将该位图附加到设备内存区域hDcMem中
// 调用BitBlt函数将窗口DC中的图像绘制到hDcMem设备内存区域

ShowWindow(hWnd,SW_SHOW);
}break;
default:
break;
}
return 0;
}

全部评论 (0)

还没有任何评论哟~