1. 如何獲取應(yīng)用程序的實(shí)例句柄?
應(yīng)用程序的 實(shí)例句柄保存在CWinAppIm_hInstance 中,可以這么調(diào)用AfxGetInstancdHandle獲得句柄.
Example: HANDLE hInstance=AfxGetInstanceHandle();
2. 如何通過代碼獲得應(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); }
說明: 獲得notepad.exe 的路徑正規(guī)上來說用GetWindowsDirectory 函數(shù)得到,如果是調(diào)用 win95下的畫筆,應(yīng)該用訪問注冊(cè)表的方法獲得其路徑,要作成一個(gè)比較考究的程序,考慮應(yīng)該全面點(diǎn).
4. 如何編程結(jié)束應(yīng)用程序?如何編程控制windows 的重新引導(dǎo)?
這是個(gè)很簡(jiǎn)單又是編程中經(jīng)常要遇到的問題.
第一問,向窗口發(fā)送 WM_CLOSE消息,調(diào)用 CWnd::OnClose成員函數(shù).允許對(duì)用戶提示是否保存修改過的數(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); }
說明: FindWindow 函數(shù)不是提倡的做法,因?yàn)樗鼰o法處理標(biāo)題欄自動(dòng)改變,比如我們要檢測(cè) Notepad 是不是已運(yùn)行而事先不知道Notepad 的標(biāo)題欄,這時(shí) FindWindow 就無能為力了,可以通過枚舉 windows 任務(wù)列表的辦法來實(shí)現(xiàn)。 在 機(jī)械出版社"Windows 95 API開發(fā)人員指南"一書有比較詳細(xì)的介紹,這里就不再多說樂。
第二問,Use ExitWindowsEx Function 函數(shù)控制系統(tǒng)是重新引導(dǎo),還是重啟 windows.
前面已經(jīng)有人講過樂,就不再提了。
5. 怎樣加栽其他的應(yīng)用程序?
我記得這好象是出場(chǎng)頻度很高的問題。
三個(gè)SDK函數(shù) winexec, shellexecute,createprocess可以使用。
WinExec 最簡(jiǎn)單,兩個(gè)參數(shù),前一個(gè)指定路徑,后一個(gè)指定顯示方式.后一個(gè)參數(shù)值得說一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一個(gè)無最大化按鈕的程序,就是Neterm,calc 等等,就不會(huì)出現(xiàn)正常的 窗體,但是已經(jīng)被加到任務(wù)列表里了。
ShellExecute較 WinExex靈活一點(diǎn),可以指定工作目錄,下面的 Example就是直接打開c:\temp\1.txt,而不用加栽與 txt 文件關(guān)聯(lián)的應(yīng)用程序,很多安裝程序完成后都會(huì)打開一個(gè)窗口,來顯示Readme or Faq,偶猜就是這么作的啦。
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);
CreateProcess最復(fù)雜,一共有十個(gè)參數(shù),不過大部分都可以用NULL 代替,它可以指定進(jìn)程的安全屬性,繼承信息,類的優(yōu)先級(jí)等等.來看個(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)用程序的 路徑
前些天好象有人問過這個(gè)問題.
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è)相反. [1] [2] 下一頁(yè)
|