1. 如何獲取控制台窗口句柄
1.調用 GetConsoleTitle() 來保存當前的控制台窗口標題。
2.調用 SetConsoleTitle() 來將控制台標題更改為一個唯一的標題。
3.調用 Sleep(40),以確保已更新窗口標題。
4.調用 FindWindow(NULL, uniquetitle),以獲取 HWND,此調用將返回 HWND, 如果操作失敗,將返回 NULL。
5.從步驟 1 中,若要恢復原始窗口標題檢索調用 SetConsoleTitle() 的值。
應該測試結果的 HWND。例如可以測試是否返回的 HWND 對應於當前進程在 HWND 上調用 GetWindowText() 並將結果與 GetConsoleTitle() 進行比較。
示例代碼
下面的函數中檢索當前控制台應用程序窗口句柄 (HWND)。如果此函數成功,則返回值是控制台窗口的句柄。如果此函數失敗,則返回值為 NULL。省略一些錯誤檢查,為簡潔起見。
HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024 // Buffer size for console window titles.
HWND hwndFound; // This is what is returned to the caller.
char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
// WindowTitle.
char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
// WindowTitle.
// Fetch current window title.
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
// Format a "unique" NewWindowTitle.
wsprintf(pszNewWindowTitle,"%d/%d",
GetTickCount(),
GetCurrentProcessId());
// Change current window title.
SetConsoleTitle(pszNewWindowTitle);
// Ensure window title has been updated.
Sleep(40);
// Look for NewWindowTitle.
hwndFound=FindWindow(NULL, pszNewWindowTitle);
// Restore original window title.
SetConsoleTitle(pszOldWindowTitle);
return(hwndFound);
}
2. 如何找軟體的句柄
Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。
句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象
3. 如何獲得另外一個應用程序中的控制項句柄
一般是用鉤子程序的。 比較復雜,只能說個大體思路,要花最少30分鍾。分太少了。 API函數的聲明就不說了。 先用findwindow找到窗體,用GetWindow和GetClassName獲得其窗體內各對象的句柄,從而可以獲得文本框的句柄。 最後用SendMessage函數想文本框發送文本。 tWnd = FindWindow(vbNullString, "窗口名")可以獲得外部程序窗口的句柄twnd bwnd = GetWindow(tWnd, GW_CHILD)可以獲得該窗口子對象的集合句柄bwnd Do Until bwnd = 0 GetClassName bwnd, sSave, 250 If InStr(1, UCase(sSave), "EDIT", vbTextCompare) <> 0 Then editwnd = bwnd Exit Do End If bwnd = GetWindow(bwnd, GW_HWNDNEXT) Loop 以上代碼可以讀到該窗口中的第一個文本框的句柄editwnd SendMessage editwnd, WM_SETTEXT, 6, "王小明" 以上代碼向editwnd中寫入「王小明」,6表示其長度。該方法寫入時,文本框中原有內容全部覆蓋。
4. 如何獲取應用程序的實例句柄
1. ? 應用程序的 實例句柄保存在CWinAppIm_hInstance 中,可以這么調用 AfxGetInstancdHandle 獲得句柄. Example: HANDLE hInstance=AfxGetInstanceHandle(); 2. 如何通過代碼獲得應用程序主窗口的指針? 主窗口的 指針保存在CWinThread::m_pMainWnd 中,調用 AfxGetMainWnd 實現。 AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化. 3. 如何在程序中獲得其他程序的 圖標? 兩種方法: (1) SDK 函數 SHGetFileInfo 或使用 ExtractIcon 獲得圖標資源的 handle, (2) SDK 函數 SHGetFileInfo 獲得有關文件的 很多信息,如大小圖標,屬性,類型等. Example(1): 在程序窗口左上角顯示 NotePad 圖標. 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 的路徑正規上來說用GetWindowsDirectory 函數得到,如果是 調用 win95 下的畫筆,應該用訪問注冊表的方法獲得其路徑,要作成一個比較考究的程 序,考慮應該全面點. 4. 如何編程結束應用程序?如何編程式控制制windows 的重新引導? 這是個很簡單又是編程中經常要遇到的問題. 第一問,向窗口發送 WM_CLOSE 消息,調用 CWnd::OnClose 成員函數.允許對用戶提示 是否保存修改過的數據. Example: AfxGetMainWindow()->SendMessage(WM_CLOSE); 還可以創建一個自定義的函數 Terminate Window void Terminate Window(LPCSTR pCaption) { CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption); if (pWnd) pWnd ->SendMessage(WM_CLOSE); } 說明: FindWindow 函數不是提倡的做法,因為它無法處理標題欄自動改變,比如我們要 檢測 Notepad 是不是已運行而事先不知道Notepad 的標題欄,這時 FindWindow 就無能 為力了,可以通過枚舉 windows 任務列表的辦法來實現。 在 機械出版社"Windows 95 API 開發人員指南"一書有比較詳細的介紹,這里就不再多說樂。 第二問,Use ExitWindowsEx Function 函數控制系統是重新引導,還是重啟 windows. 前面已經有人講過樂,就不再提了。 5. 怎樣加栽其他的應用程序? 我記得這好象是出場頻度很高的問題。 三個SDK 函數 winexec, shellexecute,createprocess 可以使用。 WinExec 最簡單,兩個參數,前一個指定路徑,後一個指定顯示方式.後一個參數值得說 一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一個無最大化按鈕的 程序,呵呵就是 Neterm,calc 等等,就不會出現正常的 窗體,但是已經被加到任務列表裡了。 ShellExecute 較 WinExex 靈活一點,可以指定工作目錄,下面的 Example 就是直接打開 c:\temp\1.txt,而不用加栽與 txt 文件關聯的應用程序,很多安裝程序完成後都會打開 一個窗口,來顯示Readme or Faq,偶猜就是這么作的啦. ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED); CreateProcess 最復雜,一共有十個參數,不過大部分都可以用NULL 代替,它可以指定 進程的安全屬性,繼承信息,類的優先順序等等.來看個很簡單的 Example: STARTUPINFO stinfo; //啟動窗口的信息 PROCESSINFO procinfo; //進程的信息 CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_ CLASS,NULL,NULL, &stinfo,&procinfo); 6. 確定應用程序的 路徑 前些天好象有人問過這個問題. Use GetMoleFileName 獲得應用程序的路徑,然後去掉可執行文件名。 Example: TCHAR exeFullPath[MAX_PATH]; // MAX_PATH 在API 中定義了吧,好象是128 GetMoleFileName(NULL,exeFullPath,MAX_PATH) 7. 獲得各種目錄信息 Windows 目錄: Use "GetWindowsDirectory「 Windows 下的system目錄: Use "GetSystemDirectory" temp 目錄: Use "GetTempPath " 當前目錄: Use "GetCurrentDirectory" 請注意前兩個函數的第一個參數為 目錄變數名,後一個為緩沖區; 後兩個相反. 8. 如何自定義消息 也有人問過的,其實不難。 (1) 手工定義消息,可以這么寫 #define WM_MY_MESSAGE(WM_USER+100), MS 推薦的至 少是 WM_USER+100; (2)寫消息處理函數,用 WPARAM,LPARAM返回LRESULT. LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam) { //加入你的處理函數 } (3) 在類的 AFX_MSG處進行聲明,也就是常說的"宏映射" 9. 如何改變窗口的圖標? 向窗口發送 WM_SECTION 消息。 Example: HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon); 10. 如何改變窗口的預設風格? 重栽 CWnd:: PreCreateWindow 並修改CREATESTRUCT 結構來指定窗口風格和其他創建 信息. Example: Delete "Max" Button and Set Original Window's Position and Size BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs) { cs.style &=~WS_MAXINIZEMOX; cs.x=cs.y=0; cs.cx=GetSystemMetrics(SM_CXSCREEN/2); cs.cy=GetSystemMetrics(SM_CYSCREEN/2); return CMDIFramewnd ::PreCreateWindow(cs); } 11. 如何將窗口居中顯示? Easy, Call Function CWnd:: Center Windows Example(1): Center Window( ); //Relative to it's parent // Relative to Screen Example(2): Center Window(CWnd:: GetDesktopWindow( )); //Relative to Application's MainWindow AfxGetMainWnd( ) -> Center Window( ); 12. 如何讓窗口和 MDI 窗口一啟動就最大化和最小化? 先說窗口。 在 InitStance 函數中設定 m_nCmdShow的 取值. m_nCmdShow=SW_SHOWMAXMIZED ; //最大化 m_nCmdShow=SW_SHOWMINMIZED ; //最小化 m_nCmdShow=SW_SHOWNORMAL ; //正常方式 MDI 窗口: 如果是創建新的應用程序,可以用 MFC AppWizard 的Advanced 按鈕並在MDI 子窗口風 格組中檢測最大化或最小化; 還可以重載 MDI Window 的PreCreateWindow函數,設置 WS_MAXMIZE or WS_MINMIZE;如果從 CMDIChildWnd 派生,調用 OnInitialUpdate 函數中 的 CWnd::Show Window來指定 MDI Child Window的 風格。 13. 如何使程序保持極小狀態? 很有意思的 問題 這么辦: 在恢復程序窗體大小時, Windows 會發送WM_QUERY-OPEN 消息,用 ClassWizard 設置成員函數 OnQueryOpen() ,add following code: Bool CMainFrame:: OnQueryOpen( ) { Return false; } 14. 如何限制窗口的大小? 也就是 FixedDialog 形式。 Windows 發送 WM_GETMAXMININFO 消息來跟蹤, 響應它, 在 OnGetMAXMININFO 中寫代碼: 15. 如何使窗口不可見? 很簡單,用SW_HIDE 隱藏窗口,可以結合 FindWindow,ShowWindow 控制. 16. 如何使窗口始終在最前方? 兩種途徑. BringWindowToTop(Handle); SetWindowPos 函數,指定窗口的 最頂風格,用WS_EX_TOPMOST 擴展窗口的 風格 Example: void ToggleTopMost( CWnd *pWnd) { ASSERT_VALID(pWnd); pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST)? &wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE}; } 1. ?應用 程序的 實例句柄保存在 CWinAppIm_hInst ance 中,可以這么調用 AfxGetInstancdHa ndle 獲得句柄.Example: HANDLE hInsta nce=AfxGetInstanceHandle( );2. 如何通過代碼獲得應 用程序主窗口的指針?主窗口 的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾 撓覺坷售踐偉淀氖義鉀偽吟 折蹬嘆駐氧牢閥陵價介嘩牌 現尿訛蠢慫珠泛浴珍礁潰軌 揮畫雪瑞崇鉗犀隱惜戌脆牽 湯炎渭族間擒琵呢 1. 顯示和隱藏標題欄 1. ?應用程序的 實例句柄保 存在 CWinAppIm_hInstance 中,可以這么 調用 AfxGetInstancdHandle 獲得句柄.Example: HANDLE hInstance=AfxGetInstanc eHandle();2. 如何通過代 碼獲得應用程序主窗口的指 針?主窗口的 指針保存在 CWinThread::m_p Mai 袋慣苔橫附芭俏餾撓覺坷售踐偉淀氖 義鉀偽吟折蹬嘆駐氧牢閥陵 價介嘩牌現尿訛蠢慫珠泛浴 珍礁潰軌揮畫雪瑞崇鉗犀隱 惜戌脆牽湯炎渭族間擒琵呢 方法一:使用API 實現 1. ?應用程序的 實 例句柄保存在 CWinAppIm_hInstance 中, 可以這么調用 AfxGetInstancdHandle 獲得句柄.Example : HANDLE hInstance=AfxGe tInstanceHandle();2. 如 何通過代碼獲得應用程序主窗 口的指針?主窗口的 指針保 存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾撓覺坷售 踐偉淀氖義鉀偽吟折蹬嘆駐 氧牢閥陵價介嘩牌現尿訛蠢 慫珠泛浴珍礁潰軌揮畫雪瑞 崇鉗犀隱惜戌脆牽湯炎渭族 間擒琵呢 //隱藏TitleBar LONG lStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE); ::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle & ~WS_CAPTION); ::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); 1. ?應用程序的 實例句柄保 存在 CWinAppIm_hInstance 中,可以這么 調用 AfxGetInstancdHandle 獲得句柄.Example: HANDLE hInstance=AfxGetInstance Handle();2. 如何通過代碼 獲得應用程序主窗口的指針 ?主窗口的 指針保存在 CWinThread::m_p Mai 袋慣苔橫附芭俏餾撓覺坷售踐偉淀氖 義鉀偽吟折蹬嘆駐氧牢閥陵 價介嘩牌現尿訛蠢慫珠泛浴 珍礁潰軌揮畫雪瑞崇鉗犀隱 惜戌脆牽湯炎渭族間擒琵呢 // 顯示TitleBar ::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle | WS_CAPTION); ::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,?SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); 方法二:使用CWnd 成員函數ModifyStyle 實現 // 隱藏TitleBar ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED); // 顯示TitleBar ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED); 1. ?應用程序的 實例句柄保存在 CWinAppIm_hI nstance 中,可以這么調用 AfxGetInstanc dHandle 獲得句柄.Example: HANDLE hIn stance=AfxGetInstanceHan dle();2. 如何通過代碼獲 得應用程序主窗口的指針?主 窗口的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭 俏餾撓覺坷售踐偉淀氖義鉀 偽吟折蹬嘆駐氧牢閥陵價介 嘩牌現尿訛蠢慫珠泛浴珍礁 潰軌揮畫雪瑞崇鉗犀隱惜戌 脆牽湯炎渭族間擒琵呢 2 . 怎麼用SendMessage()來發送消息來清空它的內容? HWND hEditWnd=GetDlgItem(IDC_EDIT1)->GetSafeHwnd(); ::SendMessage(hEditWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)""); 1. ?應用 程序的 實例句柄保存在 CWinAppIm_hInsta nce 中,可以這么調用 AfxGetInstancdHan dle 獲得句柄.Example: HANDLE hInstan ce=AfxGetInstanceHandle( );2. 如何通過代碼獲得應用 程序主窗口的指針?主窗口 的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾 撓覺坷售踐偉淀氖義鉀偽吟折蹬嘆駐氧牢閥陵價介嘩牌現尿 訛蠢慫珠泛浴珍礁潰軌揮畫 雪瑞崇鉗犀隱惜戌脆牽湯炎 渭族間擒琵呢 3. 彈出文件的屬性窗口 SHELLEXECUTEINFO ShExecInfo ={0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = "properties"; ShExecInfo.lpFile = "c:\"; //也可以是文件 ShExecInfo.lpParameters = ""; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); 1. ?應用程序的 實例句柄 保存在 CWinAppIm_hInstance 中,可以這 么調用 AfxGetInstancdHandle 獲得句柄.Example: HAND LE hInstance=AfxGetInsta nceHandle();2. 如何通過 代碼獲得應用程序主窗口的 指針?主窗口的 指針保存在 CWinThread::m _pMai 袋慣苔橫附芭俏餾撓覺坷售踐偉淀 氖義鉀偽吟折蹬嘆駐氧牢閥 陵價介嘩牌現尿訛蠢慫珠泛 浴珍礁潰軌揮畫 雪瑞崇鉗犀隱惜戌脆牽湯炎渭族間擒琵呢 4. 刪除一個目錄下的所有文件 1. ?應用程 序的 實例句柄保存在 CWinAppIm_hInsta nce 中,可以這么調用 AfxGetInstancdHan dle 獲得句柄.Example: HANDLE hInstanc e=AfxGetInstanceHandle() ;2. 如何通過代碼獲得應用 程序主窗口的指針?主窗口 的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾 撓覺坷售踐偉淀氖義鉀偽吟 折蹬嘆駐氧牢閥陵價介嘩牌 現尿訛蠢慫珠泛浴珍礁潰軌揮 畫雪瑞崇鉗犀隱惜戌脆牽湯 炎渭族間擒琵呢 BOOL DeleteDirectory(LPCTSTR DirName) { CFileFind tempFind; //聲明一個CFileFind 類變數,以用來搜索 char tempFileFind[200]; //用於定義搜索格式 sprintf(tempFileFind,"%s\\*.*",DirName); //匹配格式為*.*,即該目錄下的所有文件 BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind); //查找第一個文件 while(IsFinded) { IsFinded=(BOOL)tempFind.FindNextFile(); //遞歸搜索其他的文件 if(!tempFind.IsDots()) //如果不是"."目錄 { char foundFileName[200]; strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200)); if(tempFind.IsDirectory()) //如果是目錄,則遞歸地調用 { //DeleteDirectory char tempDir[200]; sprintf(tempDir,"%s\\%s",DirName,foundFileName); DeleteDirectory(tempDir); } else { //如果是文件則直接刪除之 char tempFileName[200]; sprintf(tempFileName,"%s\\%s",DirName,foundFileName); DeleteFile(tempFileName); } } } tempFind.Close(); if(!RemoveDirectory(DirName)) //刪除目錄 { AfxMessageBox("刪除目錄失敗!",MB_OK); return FALSE; } return TRUE; } 1. ?應用 程序的 實例句柄保存在 CWinAppIm_hInst ance 中,可以這么調用 AfxGetInstancdHa ndle 獲得句柄.Example: HANDLE hInsta nce=AfxGetInstanceHandle( );2. 如何通過代碼獲得應 用程序主窗口的指針?主窗口 的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾 撓覺坷售踐偉淀氖義鉀偽吟 折蹬嘆駐氧牢閥陵價介嘩牌 現尿訛蠢慫珠泛浴珍礁潰軌 揮畫雪瑞崇鉗犀隱惜戌脆牽 湯炎渭族間擒琵呢 5.lib 和dll 文件的區別和聯系 1. ?應用程序 的 實例句柄保存在 CWinAppIm_hInstance 中,可以這么調用 AfxGetInstancdHandle 獲得句柄.Ex ample: HANDLE hInstance= AfxGetInstanceHandle();2 . 如何通過代碼獲得應用程 序主窗口的指針?主窗口的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾撓覺 坷售踐偉淀氖義鉀偽吟折蹬 嘆駐氧牢閥陵價介嘩牌現尿 訛蠢慫珠泛浴珍礁潰軌揮畫 雪瑞崇鉗犀隱惜戌脆牽湯炎 渭族間擒琵呢 .dll 是在你的程序運行的時候才連接的文件,因此它是一種比較小的可執行文件格式,.dll 還有其他的文件格式如.ocx 等,所有的.dll 文件都是可執行。 1. ?應用程序的 實例句柄保存在 CWinAppIm_ hInstance 中,可以這么調用 AfxGetInsta ncdHandle 獲得句柄.Example: HANDLE h Instance=AfxGetInstanceH andle();2. 如何通過代碼 獲得應用程序主窗口的指針? 主窗口的 指針保存在 CWinThread::m_pMai 袋慣苔橫附 芭俏餾撓覺坷售踐偉淀氖義 鉀偽吟折蹬嘆駐氧牢閥陵價 介嘩牌現尿訛蠢慫珠泛浴珍 礁潰軌揮畫雪瑞崇鉗犀隱惜 戌脆牽湯炎渭族間擒琵呢 .lib 是在你的程序編譯連接的時候就連接的文件,因此你必須告知編譯器連接的lib 文件在那裡。一般來說,與動態連接文件相對比,lib 文件也被稱為是靜態連接庫。當你把代碼編譯成這幾種格式的文件時,在以後他們就不可能再被更改。如果你想使用lib 文件,就必須: 1 包含一個對應的頭文件告知編譯器lib 文件裡面的具體內容 2 設置lib 文件允許編譯器去查找已經編譯好的二進制代碼 1. ?應用程序 的 實例句柄保存在 CWinAppIm_hInstanc e 中,可以這么調用 AfxGetInstancdHandle 獲得句柄.E xample: HANDLE hInstance =AfxGetInstanceHandle();2 . 如何通過代碼獲得應用程 序主窗口的指針?主窗口的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾撓 覺坷售踐偉淀氖義鉀偽吟折 蹬嘆駐氧牢閥陵價介嘩牌現 尿訛蠢慫珠泛浴珍礁潰軌揮 畫雪瑞崇鉗犀隱惜戌脆牽湯 炎渭族間擒琵呢 如果你想從你的代碼分離一個dll 文件出來代替靜態連接庫,仍然需要一個lib 文件。這個lib 文件將被連接到程序告訴操作系統在運行的時候你想用到什麼dll 文件,一般情況下,lib 文件里有相應的dll 文件的名字和一個指明dll 輸出函數入口的順序表。如果不想用lib 文件或者是沒有lib 文件,可以用WIN32 API 函數LoadLibrary、GetProcAddress。事實上,我們可以在 Visual C++ IDE 中以二進制形式打開lib 文件,大多情況下會看到ASCII 碼格式的C++函數或一些重載操作的函數名字。 1. ?應用程序的 實例句柄保存在 CWinAppIm_hI nstance 中,可以這么調用 AfxGetInstanc dHandle 獲得句柄.Example: HANDLE hIn stance=AfxGetInstanceHan dle();2. 如何通過代碼獲 得應用程序主窗口的指針?主 窗口的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭 俏餾撓覺坷售踐偉淀氖義鉀 偽吟折蹬嘆駐氧牢閥陵價介 嘩牌現尿訛蠢慫珠泛浴珍礁 潰軌揮畫雪瑞崇鉗犀隱惜戌 脆牽湯炎渭族間擒琵呢 一般我們最主要的關於lib 文件的麻煩就是出現unresolved symble 這類錯誤,這就是lib 文件連接錯誤或者沒有包含.c、.cpp 文件到工程里,關鍵是如果在C++工程里用了C 語言寫的 lib 文件,就必需要這樣包含: extern "C" { #include "myheader.h" } 這是因為C 語言寫的lib 文件沒有C++所必須的名字破壞,C 函數不能被重載,因此連接器會出錯。 1. ?應用程序的 實例 句柄保存在 CWinAppIm_hInstance 中,可 以這么調用 AfxGetInstancdHandle 獲得句柄.Example: H ANDLE hInstance=AfxGetIn stanceHandle();2. 如何通 過代碼獲得應用程序主窗口 的指針?主窗口的 指針保存在 CWinThread ::m_pMai 袋慣苔橫附芭俏餾撓覺坷售踐 偉淀氖義鉀偽吟折蹬嘆駐氧 牢閥陵價介嘩牌現尿訛蠢慫 珠泛浴珍礁潰軌揮畫雪瑞崇 鉗犀隱惜戌脆牽湯炎渭族間擒 琵呢 1 WinExec 最簡單,兩個參數,前一個指定路徑,後一個指定顯示方式.後一個參數值得說 一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一個無最大化按鈕的 程序,呵呵就是 Neterm,calc 等等,就不會出現正常的 窗體,但是已經被加到任務列表裡了。 2 ShellExecute 較 WinExex 靈活一點,可以指定工作目錄,下面的 Example 就是直接打開 c:\temp\1.txt,而不用加栽與 txt 文件關聯的應用程序,很多安裝程序完成後都會打開 一個窗口,來顯示Readme or Faq,偶猜就是這么作的啦. ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED); 3 CreateProcess 最復雜,一共有十個參數,不過大部分都可以用NULL 代替,它可以指定 進程的安全屬性,繼承信息,類的優先順序等等.來看個很簡單的 Example: STARTUPINFO stinfo; //啟動窗口的信息 PROCESSINFO procinfo; //進程的信息 CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_ CLASS,NULL,NULL, &stinfo,&procinfo); 1. ?應用程序的 實例句柄保 存在 CWinAppIm_hInstance 中,可以這么調用 AfxGetIns tancdHandle 獲得句柄.Example: HANDLE hInstance=AfxGetInstance Handle();2. 如何 通過代碼獲得應用程序主窗口的指針?主 窗口的 指針保存在 CWinThread::m_pMai 袋慣苔橫附芭 俏餾撓覺坷售踐偉淀氖義鉀 偽吟折蹬嘆駐氧牢閥陵價介 嘩牌現尿訛蠢慫珠泛浴珍礁 潰軌揮畫雪瑞崇鉗犀隱惜戌 脆牽湯炎渭族間擒琵呢 在啟動程序的時候ShellExecute 函數使用的比較多,下面詳細的解釋了它的有關參數! ShellExecute 函數打開或列印一個指定的文件。文件可以是可執行文件也可以是一個文檔。 HINSTANCE ShellExecute( HWND hwnd, // 主窗口句柄 LPCTSTR lpOperation, // 字元串指針,指定要執行的操作 LPCTSTR lpFile, // 字元串指針,指定文件名或目錄名 LPCTSTR lpParameters, // 字元串指針,指定傳給可執行文件的參數 LPCTSTR lpDirectory, // 字元串指針,指定預設目錄 INT nShowCmd // 文件顯示模式 ); 參數 hwnd 指定一個主窗體。 lpOperation 一個非空的字元串指針,指定操作方式。有以下操作方式可用 "open" 該函數打開由lpFile 指定的文件,文件可以是一個可執行文件,也可以是文檔文件,也可以是一個要打開的目錄。 "print" 該函數列印由lpFile 指定的文件。文件應該是一個文檔文件。如果是一個可執行文件則運行這個文件就象指定用"opne"操作方式一樣。 "explore" 函數打開瀏覽由lpFile 指定的目錄窗口。 如果該參數為NULL,則相當於使用"open"操作方式。 lpFile 一個非空字元串指定要打開或列印的文件,或者是要打開瀏覽的目錄名。該函數可以打開一個可執行文件或一個文檔文件,也可以列印一個文件。 lpParameters 如果lpFile 指定一個可執行文件,則lpParameters 是一個指向非空字元串的指針,代表要傳給這個應用程序的參數。 如果lpFile 指定一個文檔文件,則其應該為空。 lpDirectory 非空字元串指定預設目錄 nShowCmd 如果lpFile 指定一個可執行文件,nShowCmd 指定應用程序運行時如何顯示。可以是下列的值: 1. ?應用程序的 實例句柄保存在 CWinAppIm_hInstance 中 ,可以這么調用 AfxGetInstancdHandle 獲得句柄.Examp le: HANDLE hInstance=AfxG etInstanceHandle();2. 如 何通過代碼獲得應用程序主 窗口的指針?主窗口的 指針 保存在 CWinThread::m_pMai 袋慣苔橫附芭俏餾撓覺坷 售踐偉淀氖義鉀偽吟折蹬嘆 駐氧牢閥陵價介嘩牌現尿訛 蠢慫珠泛浴珍礁潰軌揮畫雪 瑞崇鉗犀隱惜戌脆牽湯炎渭 族間擒琵呢 值 意義 SW_HIDE 隱藏窗體,激活另一個窗口。 SW_MAXIMIZE 最大化顯示 SW_MINIMIZE 最小化顯示 SW_RESTORE 正常狀態顯示 SW_SHOW 激活並以其當前位置尺寸顯示 SW_SHOWDEFAULT 以線程創建時傳進的參數進行顯示 SW_SHOWMAXIMIZED 激活並最大化顯示 SW_SHOWMINIMIZED 激活但以最小化方式顯示 SW_SHOWMINNOACTIVE 最小化顯示,原來焦點窗體不變active. SW_SHOWNA 以其當前狀態顯示 SW_SHOWNOACTIVATE SW_SHOWNORMAL 以正常方式顯示。 如果lpFile 指定的是文檔文件,則nShowCmd 應該為0。 1. ?
5. C++ 怎麼在程序中獲得 另外一個程序的句柄
具體是哪個函數名我忘記了,你自己查函數手冊吧!先用快照函數獲得系統所有進程列表,可以得到進程ID,然後通過ID得到該進程的句柄。
6. c++中的句柄是什麼意思,如何理解
分類: 電腦/網路 >> 程序設計 >> 其他編程語言
問題描述:
請通俗的解釋一下
解析:
所謂句柄實際上是一個數據,是一個Long (整長型)的數據。
句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。
從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麼就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該對象呢?
為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。
句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象
本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。
但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麼系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。
7. 獲取程序按鈕 句柄
如果是你正在編譯的程序的話,command1.hwnd就是這個按鈕的句柄
如果是其他應用程序的按鈕,則要通過findwindowex這個api函數,具體方法參考網路:
1、函數功能
在窗口列表中尋找與指定條件相符的第一個子窗口 。 該函數獲得一個窗口的句柄,該窗口的類名和窗口名與給定的字元串相匹配。這個函數查找子窗口,從排在給定的子窗口後面的下一個子窗口開始。在查找時不區分大小寫。
2、函數原型:
HWND FindWindowEx( HWND1 hwndParent, HWND2 hwndChildAfter, LPCTSTR1 lpszClass, LPCTSTR2 lpszWindow );