1. 如何獲取應(yīng)用程序的實(shí)例句柄?
應(yīng)用程序的 實(shí)例句柄保存在CWinAppIm_hInstance 中,可以這么調(diào)用
AfxGetInstancdHandle獲得句柄.
Example: HANDLE hInstance=AfxGetInstanceHandle();
2. 如何通過(guò)代碼獲得應(yīng)用程序主窗口的指針?
主窗口的 指針保存在CWinThread::m_pMainWnd中,調(diào)用 AfxGetMainWnd實(shí)現(xiàn)。
AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序化.
3. 如何在程序中獲得其他程序的 圖標(biāo)
兩種方法:
(1) SDK函數(shù) SHGetFileInfo 或使用 ExtractIcon獲得圖標(biāo)資源的 handle,
(2) SDK函數(shù) SHGetFileInfo獲得有關(guān)文件的 很多信息,如大小圖標(biāo),屬性,類型等.
Example(1): 在程序窗口左上角顯示 NotePad圖標(biāo).
void CSampleView: OnDraw(CDC * pDC)
{
if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon);
}
}
Example(2): 同樣功能,Use ExtractIcon Function
void CSampleView:: OnDraw(CDC *pDC)
{
HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon);
}
說(shuō)明: 獲得notepad.exe 的路徑正規(guī)上來(lái)說(shuō)用GetWindowsDirectory 函數(shù)得到,如果是
調(diào)用 win95下的畫(huà)筆,應(yīng)該用訪問(wèn)注冊(cè)表的方法獲得其路徑,要作成一個(gè)比較考究的程
序,考慮應(yīng)該全面點(diǎn).
4. 如何編程結(jié)束應(yīng)用程序?如何編程控制windows 的重新引導(dǎo)?
這是個(gè)很簡(jiǎn)單又是編程中經(jīng)常要遇到的問(wèn)題.
第一問(wèn),向窗口發(fā)送 WM_CLOSE消息,調(diào)用 CWnd::OnClose成員函數(shù).允許對(duì)用戶提示
是否保存修改過(guò)的數(shù)據(jù).
Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);
還可以創(chuàng)建一個(gè)自定義的函數(shù) Terminate Window
void Terminate Window(LPCSTR pCaption)
{
CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);
if (pWnd)
pWnd ->SendMessage(WM_CLOSE);
}
說(shuō)明: FindWindow 函數(shù)不是提倡的做法,因?yàn)樗鼰o(wú)法處理標(biāo)題欄自動(dòng)改變,比如我們要
檢測(cè) Notepad 是不是已運(yùn)行而事先不知道Notepad 的標(biāo)題欄,這時(shí) FindWindow 就無(wú)能
為力了,可以通過(guò)枚舉 windows 任務(wù)列表的辦法來(lái)實(shí)現(xiàn)。 在 機(jī)械出版社"Windows 95
API開(kāi)發(fā)人員指南"一書(shū)有比較詳細(xì)的介紹,這里就不再多說(shuō)樂(lè)。
第二問(wèn),Use ExitWindowsEx Function 函數(shù)控制系統(tǒng)是重新引導(dǎo),還是重啟 windows.
前面已經(jīng)有人講過(guò)樂(lè),就不再提了。
5. 怎樣加栽其他的應(yīng)用程序?
我記得這好象是出場(chǎng)頻度很高的問(wèn)題。
三個(gè)SDK函數(shù) winexec, shellexecute,createprocess可以使用。
WinExec 最簡(jiǎn)單,兩個(gè)參數(shù),前一個(gè)指定路徑,后一個(gè)指定顯示方式.后一個(gè)參數(shù)值得說(shuō)
一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一個(gè)無(wú)化按鈕的 程序,呵呵就是
Neterm,calc 等等,就不會(huì)出現(xiàn)正常的 窗體,但是已經(jīng)被加到任務(wù)列表里了。
ShellExecute較 WinExex靈活一點(diǎn),可以指定工作目錄,下面的 Example就是直接打開(kāi)
c:\temp\1.txt,而不用加栽與 txt 文件關(guān)聯(lián)的應(yīng)用程序,很多安裝程序完成后都會(huì)打開(kāi)
一個(gè)窗口,來(lái)顯示Readme or Faq,偶猜就是這么作的啦.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);
CreateProcess最復(fù)雜,一共有十個(gè)參數(shù),不過(guò)大部分都可以用NULL 代替,它可以指定
進(jìn)程的安全屬性,繼承信息,類的優(yōu)先級(jí)等等.來(lái)看個(gè)很簡(jiǎn)單的 Example:
STARTUPINFO stinfo; //啟動(dòng)窗口的信息
PROCESSINFO procinfo; //進(jìn)程的信息
CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo,&procinfo);
6. 確定應(yīng)用程序的 路徑
前些天好象有人問(wèn)過(guò)這個(gè)問(wèn)題.
Use GetModuleFileName 獲得應(yīng)用程序的路徑,然后去掉可執(zhí)行文件名。
Example:
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH在API中定義了吧,好象是128
GetModuleFileName(NULL,exeFullPath,MAX_PATH)
7. 獲得各種目錄信息
Windows目錄: Use "GetWindowsDirectory“
Windows下的system目錄: Use "GetSystemDirectory"
temp目錄: Use "GetTempPath "
當(dāng)前目錄: Use "GetCurrentDirectory"
請(qǐng)注意前兩個(gè)函數(shù)的第一個(gè)參數(shù)為 目錄變量名,后一個(gè)為緩沖區(qū); 后兩個(gè)相反.
8. 如何自定義消息
也有人問(wèn)過(guò)的,其實(shí)不難。
(1) 手工定義消息,可以這么寫(xiě) #define WM_MY_MESSAGE(WM_USER+100), MS 推薦的至
少是 WM_USER+100;
(2)寫(xiě)消息處理函數(shù),用 WPARAM,LPARAM返回LRESULT.
LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)
{
//加入你的處理函數(shù)
}
(3) 在類的 AFX_MSG處進(jìn)行聲明,也就是常說(shuō)的"宏映射"
應(yīng)用程序的 實(shí)例句柄保存在CWinAppIm_hInstance 中,可以這么調(diào)用
AfxGetInstancdHandle獲得句柄.
Example: HANDLE hInstance=AfxGetInstanceHandle();
2. 如何通過(guò)代碼獲得應(yīng)用程序主窗口的指針?
主窗口的 指針保存在CWinThread::m_pMainWnd中,調(diào)用 AfxGetMainWnd實(shí)現(xiàn)。
AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序化.
3. 如何在程序中獲得其他程序的 圖標(biāo)
兩種方法:
(1) SDK函數(shù) SHGetFileInfo 或使用 ExtractIcon獲得圖標(biāo)資源的 handle,
(2) SDK函數(shù) SHGetFileInfo獲得有關(guān)文件的 很多信息,如大小圖標(biāo),屬性,類型等.
Example(1): 在程序窗口左上角顯示 NotePad圖標(biāo).
void CSampleView: OnDraw(CDC * pDC)
{
if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon);
}
}
Example(2): 同樣功能,Use ExtractIcon Function
void CSampleView:: OnDraw(CDC *pDC)
{
HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon);
}
說(shuō)明: 獲得notepad.exe 的路徑正規(guī)上來(lái)說(shuō)用GetWindowsDirectory 函數(shù)得到,如果是
調(diào)用 win95下的畫(huà)筆,應(yīng)該用訪問(wèn)注冊(cè)表的方法獲得其路徑,要作成一個(gè)比較考究的程
序,考慮應(yīng)該全面點(diǎn).
4. 如何編程結(jié)束應(yīng)用程序?如何編程控制windows 的重新引導(dǎo)?
這是個(gè)很簡(jiǎn)單又是編程中經(jīng)常要遇到的問(wèn)題.
第一問(wèn),向窗口發(fā)送 WM_CLOSE消息,調(diào)用 CWnd::OnClose成員函數(shù).允許對(duì)用戶提示
是否保存修改過(guò)的數(shù)據(jù).
Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);
還可以創(chuàng)建一個(gè)自定義的函數(shù) Terminate Window
void Terminate Window(LPCSTR pCaption)
{
CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);
if (pWnd)
pWnd ->SendMessage(WM_CLOSE);
}
說(shuō)明: FindWindow 函數(shù)不是提倡的做法,因?yàn)樗鼰o(wú)法處理標(biāo)題欄自動(dòng)改變,比如我們要
檢測(cè) Notepad 是不是已運(yùn)行而事先不知道Notepad 的標(biāo)題欄,這時(shí) FindWindow 就無(wú)能
為力了,可以通過(guò)枚舉 windows 任務(wù)列表的辦法來(lái)實(shí)現(xiàn)。 在 機(jī)械出版社"Windows 95
API開(kāi)發(fā)人員指南"一書(shū)有比較詳細(xì)的介紹,這里就不再多說(shuō)樂(lè)。
第二問(wèn),Use ExitWindowsEx Function 函數(shù)控制系統(tǒng)是重新引導(dǎo),還是重啟 windows.
前面已經(jīng)有人講過(guò)樂(lè),就不再提了。
5. 怎樣加栽其他的應(yīng)用程序?
我記得這好象是出場(chǎng)頻度很高的問(wèn)題。
三個(gè)SDK函數(shù) winexec, shellexecute,createprocess可以使用。
WinExec 最簡(jiǎn)單,兩個(gè)參數(shù),前一個(gè)指定路徑,后一個(gè)指定顯示方式.后一個(gè)參數(shù)值得說(shuō)
一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一個(gè)無(wú)化按鈕的 程序,呵呵就是
Neterm,calc 等等,就不會(huì)出現(xiàn)正常的 窗體,但是已經(jīng)被加到任務(wù)列表里了。
ShellExecute較 WinExex靈活一點(diǎn),可以指定工作目錄,下面的 Example就是直接打開(kāi)
c:\temp\1.txt,而不用加栽與 txt 文件關(guān)聯(lián)的應(yīng)用程序,很多安裝程序完成后都會(huì)打開(kāi)
一個(gè)窗口,來(lái)顯示Readme or Faq,偶猜就是這么作的啦.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);
CreateProcess最復(fù)雜,一共有十個(gè)參數(shù),不過(guò)大部分都可以用NULL 代替,它可以指定
進(jìn)程的安全屬性,繼承信息,類的優(yōu)先級(jí)等等.來(lái)看個(gè)很簡(jiǎn)單的 Example:
STARTUPINFO stinfo; //啟動(dòng)窗口的信息
PROCESSINFO procinfo; //進(jìn)程的信息
CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo,&procinfo);
6. 確定應(yīng)用程序的 路徑
前些天好象有人問(wèn)過(guò)這個(gè)問(wèn)題.
Use GetModuleFileName 獲得應(yīng)用程序的路徑,然后去掉可執(zhí)行文件名。
Example:
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH在API中定義了吧,好象是128
GetModuleFileName(NULL,exeFullPath,MAX_PATH)
7. 獲得各種目錄信息
Windows目錄: Use "GetWindowsDirectory“
Windows下的system目錄: Use "GetSystemDirectory"
temp目錄: Use "GetTempPath "
當(dāng)前目錄: Use "GetCurrentDirectory"
請(qǐng)注意前兩個(gè)函數(shù)的第一個(gè)參數(shù)為 目錄變量名,后一個(gè)為緩沖區(qū); 后兩個(gè)相反.
8. 如何自定義消息
也有人問(wèn)過(guò)的,其實(shí)不難。
(1) 手工定義消息,可以這么寫(xiě) #define WM_MY_MESSAGE(WM_USER+100), MS 推薦的至
少是 WM_USER+100;
(2)寫(xiě)消息處理函數(shù),用 WPARAM,LPARAM返回LRESULT.
LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)
{
//加入你的處理函數(shù)
}
(3) 在類的 AFX_MSG處進(jìn)行聲明,也就是常說(shuō)的"宏映射"