編寫TaskMgr.exe的時候學習的知識點

來源:互聯網
上載者:User

第一次做這個小程式,只能一點一滴積累了。回頭看看,真是。。。。

現在把自己的記錄放到空間裡面,方便以後回看。

1.在進行資料交換時一個子視窗可以和兩種類型的變數相關聯,一種是控制項,另一種是資料類型。故可以通過控制項控制子視窗,資料類型可以接收子視窗的值。

2.MB_ICONINFORMATION   :An icon consisting of an “i” in a circle appears in the message box.

3.CTabCtrl是一個直接從CWnd派生來的類.

4.如何把int轉換成CString?如何把DWORD轉換為CString?
答:int   i=123; 
   CString   str; 
   str.Format( "%d ",i);

DWORD dwPid = 1234;
CString str;
str.Format(_T("%d"),dwPid); 

5.用到的函數
CStatusBar::SetPaneInfo()

6.當使用者的滑鼠 移動到一個功能表項目時,Windows發送WM_MENUSELECT和功能表項目的ID。然後需要自己添加訊息聲明,訊息映射,以及訊息響應函數OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)。

意思是架構發送WM_SETMESSAGESTRING訊息到自身,用WPARAM傳遞命令ID。SETMESSAGESTRING 是MFC的一個私人訊息,它在afxpriv.h中定義。這個訊息在狀態條窗格中設定 要顯示的文本。你可以用WPARAM傳遞資源串的ID,或者用LPARAM傳遞實際的串

7.error C2065: 'WM_SETMESSAGESTRING' : undeclared identifier
這個錯誤是編寫一個在狀態列中載入進度條時出現的錯誤,解決方案如下:
在StaAfx.h 中加入#include <afxpriv.h> 標頭檔

8.如果你編譯一個程式為ANSI方式,_T實際不起任何作用。而如果編譯一個程式為UNICODE方式,則編譯器會把"Hello"字串以UNICODE方式儲存。
_T和_L的區別在於,_L不管你是以什麼方式編譯,一律以UNICODE方式儲存

9.NM_CLICK 這個是滑鼠左鍵點擊CListCtrl控制項客戶區時激發的訊息,可以在裡面做點擊的處理

10.結束進程和結束視窗是有區別的
SendMessage(),發送WM_CLOSE訊息來關閉指定的視窗。
GetWindowText(),獲得視窗標題,通過下標在控制代碼數組裡面獲得視窗控制代碼
GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId),通過視窗的控制代碼獲得進程ID。
OpenProcess(DWORD fdwAccess,BOOL fInherit,DWORD IDProcess),獲得視窗控制代碼對應的進程控制代碼。
BOOL GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode)通過進程控制代碼獲得進程結束碼。
TerminateProcess(HANDLE hProcess, DWORD uExitCode),通過進程結束碼結束進程。
注意:1.視窗控制代碼與視窗對應的進程控制代碼不一樣。
      2.SendMessage是結束一個視窗,TerminateProcess可以結束此進程以及其產生的所有線程。

11.WM_CLOSE:關閉按鈕,alt+F4; 
WM_DESTROY:在訊息迴圈裡釋放對象及記憶體等; 
WM_QUIT:結束訊息迴圈;

12.UNICODE轉換問題,在VC2005中主要使用UNICODE編碼,需要這樣寫: 
strMemStat.Format(_T("%d"), 255); 
在UNICODE或者ASCII編碼都能使用。

13.如何使用psapi.lib?
答:psapi.lib複製到vc++6.0的lib目錄下(如:C:\Program Files\Microsoft Visual Studio\VC98\Lib),psapi.h複製到Include目錄下(如:C:\Program Files\Microsoft Visual Studio\VC98\Include)便可使用,psapi.dll一般在system32目錄下會內建,所以可以不做操作

在vc中使用時,需加入以下代碼:
#include <psapi.h>   
#pragma   comment(lib,"psapi.lib")
================================================================
14.若案頭開啟的視窗的表徵圖控制代碼為空白,如何獲得對應的表徵圖?
答:獲得該視窗的控制代碼IsWindow()-->視窗對應的進程ID"GetWindowThreadProcessId()"-->由進程ID得到進程控制代碼OpenProcess()-->進程對應的可執行檔的路徑GetModuleFileNameEx()-->獲得表徵圖ExTractIcon()

15.如何動態改變tabCtrl控制項的大小?
答:tabCtrl也是一個視窗,獲得該視窗的控制代碼GetSafeHwnd(),然後MoveWindow()或者SetWindowPos(); 就OK了.

16.GetFirstSelectedItemPosition和GetNextSelectedItem如何用??
答:代碼裡面有的

17.如何引用Hook.dll?
答:見《VC++深入詳解》p744

18.如何得到螢幕寬度和高度?
答:GetSystemMetrics函數。

19. extern關鍵字表面函數是在外部定義,而_declspec(dllimport) 表明函數是從動態連結程式庫中引入的。__declspec(dllexport)   聲明一個匯出函數,一般用於dll中 
__declspec(dllimport)   聲明一個匯入函數,一般用於使用某個dll的exe中 

20.如何調用DLL中的函數?
答:1.隱式連結載入;2.動態載入GetProcAddress

21.如果你需要截獲WM_CREATE訊息,必需配合使用WH_CBT鉤子。

http://www.microsoft.com/msj/0699/c/c0699.aspx

你去看看MFC的原始碼,因為Windows上WM_CREATE是由CreateWindow觸發,截獲WM_CREATE的時候還沒有有效視窗控制代碼,函數CreateWindow還沒有完全完成自己定義的訊息不能跨進程發送,用RegisterWindowMessage註冊自訂訊息才行。
WH_GETMESSAGE類型Hook的是PostMessage發送的訊息;SendMessage發送的訊息要用WH_CALLWNDPROC類型才能Hook到。
在視窗建立、銷毀之前系統都會調用掛上了WH_CBT的鉤子函數

22.如何把CString轉換為LPSTR?
答:CString   tmp= "abcde "; 
LPSTR lpstr; 
lpstr =  (LPSTR)(LPCTSTR)tmp   //經過這樣的強制轉換。

23.記憶體配置記錄,堆分配,棧分配。。
答:一個函數內定義的局部變數就是分配在棧上的,函數退出時,移動棧指標,這些分配的臨時變數的空間就收回了。

24.根據視窗控制代碼如何擷取視窗對象指標?
答:CWnd   *cWnd   =   CWnd::FromHandle(m_hWnd);

25.使ListCtrl裡面的某一項處於選中狀態?
答:1.在主對話方塊的OnInitDialog()的傳回值要設定return FALSE;
2.在我的程式裡面添加如下代碼
m_list11.SetFocus();      //ListCtrl控制項獲得焦點
m_list11.SetItemState(0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);

26.在視窗失去焦點時會觸發WM_KILLFOCUS訊息。

27.調節視窗大小,父視窗會重新整理底色的。。辦法:把父視窗的clip children設定成True

28.如何通過進程ID獲得進程控制代碼?
答:通過OpenProcess()這個API。

29._bstr_t如何轉換為CString?
答:_bstr_t   vt; 
CString   sValue; 
sValue.Format( "%s ",(LPCTSTR)vt);

30.Win32子系統是由csrss.exe來管理的
csrss.exe   >   Client   Server   Runtime   Process   客戶服務器Runtime進程
csrss.exe是Windows   2000的核心進程,您通常在使用者模式下無法終止該進程

21.無法得到csrss.exe以及系統服務的記憶體使用量?
答:在使用GetProcessMemoryInfo()時,必須先提升調用程式的優先順序。

22.ULONG,CString,DOWD都是4個位元組(VC++6.0測試)
     LONGLONG,FILETIME,LARGE_INTEGER都是8個位元組(VC++6.0測試)

23._stricmp, _wcsicmp。
Perform a lowercase comparison of strings.
含義:先把比較2個兩個字元都換成小寫,再給出比較結果。

24.屏蔽VC++6.0中的4786警告。#pragma warning (disable:4786)

25.如何在VC++6.0裡面使用EnumProcesses()?
答:包含標頭檔psapi.h,另外#pragma comment(lib,"psapi.lib")

26.如何在CDialog2裡面引用CEleven6Dlg的m_wndStatusBar對象的?
答:重新定義一個CStatusBar *p_wndStatusBar;傳遞指標給CDialog2

27.如何通過一個視窗的控制代碼來獲得進程的PID  ?
DWORD dwPID;
GetWindowThreadProcessId(hWnd, &dwPID);

28.System,System Idle Process是系統關鍵進程,暫時無法捕獲。。
Idle的pid不在PspCidTable中,因此無法開啟
windows vista以後System和audiodg.exe屬於受保護進程,使用者模式下的程式只能擷取有限的access

要開啟受保護的進程,可以使用核心模式驅動程式

29.C++的寬字元串的輸出?
答:用wcout.....

30.如何在C++中重載“<<”運算子?
答:下面的例子要注意,需要匯入iostream,因為ostream在命名空間std裡面。
class CTest
{
    friend std::ostream & operator <<(std::ostream &outs,
                                      const CTest &test);

public:
    // ...
private:
    std::string m_strText;
    // ... 其他成員變數
};

std::ostream & operator <<(std::ostream &outs, const CTest &test)
{
    outs << test.m_strText << ...; // 訪問類成員,寫入輸出資料流
    return outs;    // 為實現 cout << " " << endl << ... << endl;
                    // 這樣的鏈式
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.