第一次做這個小程式,只能一點一滴積累了。回頭看看,真是。。。。
現在把自己的記錄放到空間裡面,方便以後回看。
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;
// 這樣的鏈式
}