小火箭原理

小火箭原理及實現

這是安全培訓的第4個項目,很多功能沒加上去。現在就簡單說一下原理和成品。

移動原理:MOVEWINDOW()這個API。圖是我做的超級簡陋的“小火箭”,如果要有火箭的圖案可以往窗口上面貼一張圖 使圖的面積大於窗口的大小即可。不過在這之前要獲取你屏幕的尺寸。
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)
 {
 case WM_TIMER:
  {
   RECT rc;
   GetWindowRect(hwndDlg,&rc);
   rc.top   -=10;
   rc.bottom-=10;
   if (rc.bottom<=0)
   {
    KillTimer(hwndDlg,1);
    ShowWindow(hwndDlg,SW_HIDE);
    CString b;
    b.Format(L"清除了%d%%內存",t-d);
    MessageBox(hwndDlg,b,L"清理成功!",1);
    break;
   }
   MoveWindow(hwndDlg,rc.left,rc.top,100,150,1); 
   InvalidateRect(hwndDlg,&rc,1);
  }
  break;
 case WM_LBUTTONDOWN:
  {

   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,(LPCTSTR)IDD_DIALOG1,NULL,DialogProc);
 return 0;
}

INT_PTR CALLBACK DialogProc(                              //主界面
       _In_ HWND   hwndDlg,
       _In_ UINT   uMsg,
       _In_ WPARAM wParam,
       _In_ LPARAM lParam
       )
{
 switch (uMsg)
 {
 case 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);

   //    g_hbitmap=LoadBitmap(g_hInstance,L"IDB_BITMAP2");
   //    GetObject(g_hbitmap,sizeof(BITMAP),&g_hbitmap); //獲取位圖尺寸 
   //    SelectObject(hDcMem,g_hbitmap); //將位圖加到設備中 
   //    BitBlt(GetDC(hWnd),0,20,Bmp.bmWidth,Bmp.bmHeight,hDcMem,0,0,SRCCOPY); //顯示位圖 


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

發佈了33 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章