Delphi中ShellExecute的妙用 ( Fri, 11 Jul 2008 08:44:48 +0800 )
有幾個API函數都可以實現這些功能,但是在大多數情況下ShellExecute是更多的被使用的,同時它並不是太複雜。下面舉例說明它的用法。 開始一個新的應用程序 ShellExecute(Handle, 'open', PChar('c:/test/app.exe'), nil, nil, SW_SHOW); 打開記事本,並打開一個文件(系統能識別記事本應用程序的路徑,因此我們不必使用絕對路徑) ShellExecute(Handle, 'open', PChar('notepad'), PChar('c:/test/readme.txt'), nil, SW_SHOW); 打印一個文檔 ShellExecute(Handle, 'print', PChar('c:/test/test.doc'), nil, nil, SW_SHOW); 注意:可能你會看到word暫時的被打開,但它會自動關閉。 打開一個HTML頁面 ShellExecute(Handle, 'open', PChar('http://www.festra.com/'), nil, nil, SW_SHOW); 你能通過一個已經註冊的文件類型來打開應用程序 ShellExecute(Handle, 'open', PChar('c:/test/readme.txt'), nil, nil, SW_SHOW); 用windows Explorer 打開一個目錄 ShellExecute(Handle, 'explore', PChar('c:/windows)', nil, nil, SW_SHOW); 運行一個DOS命令並立即返回 ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c copy file1.txt file2.txt'), nil, SW_SHOW); Shellexecute(handle,nil,'cmd.exe',pchar('/c arp -s 192.168.2.3 00-11-00-62-c6-09'),nil,sw_shownormal);(如ARP免疫,192.168.2.3 需改爲網關地址,'00-11-00-62-c6-09'改爲網關MAC地址) 運行一個DOS命令並保持DOS窗口存在 ShellExecute(Handle, 'open', PChar('command.com'), PChar('/k dir'), nil, SW_SHOW); ShellExecute詳解 ShellExecute函數用於打開或者打印一個指定的文件。指定的文件必須是可執行文件或者文檔文件。 HINSTANCE ShellExecute( HWND hwnd, // handle to parent window LPCTSTR lpOperation, // pointer to string that specifies operation to perform LPCTSTR lpFile, // pointer to filename or folder name string LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters LPCTSTR lpDirectory, // pointer to string that specifies default directory INT nShowCmd // whether file is shown when opened ) * Params(參數解釋) Hwnd 指定父窗口句柄。這個窗口接收工程產生的所有消息。例如:一個工程可以通過消息框報告錯誤。 lpOperation 以一個以null結束的字符串描述操作的執行。以下的操作字符串是有效的: 行號 參數 含義 1 “open” 函數打開由lpFile指定的文件。這個文件必須是可執行文件或者文檔文件。文件夾必須是可打開的文件夾。 2 “print” 函數打印由lpFile指定的文件。這個文件應該是文檔文件。如果指定的文件是可執行文件,函數將以open的方式打開這個文件。 3 “explore” 函數將搜索由lpFile指定的文件夾。 lpOperation參數如果爲null,函數將以open的方式打開由lpFile指定的文件。 lpFile 以一個null結束的字符串描述打開或者打印指定的文件,或者打開或者搜索指定的 文件夾。函數可以打開一個指定的文件或者文件夾,也可以打印一個文檔文件。 lpParameters 如果lpFile指定的是一個可執行文件,lpParameters以一個以null結束的字符串指定該執行文件傳給應用軟件的參數。 行號 參數 含義 1 SW_HIDE 隱藏這個窗體,並激活其他窗體。 2 SW_MAXIMIZE 最大化指定的窗體。 3 SW_MINIMIZE 最小化指定的窗體,並按順序激活最上層的窗體。 4 SW_RESTORE 激活並顯示窗體。如果窗體爲最小化或者最大化,窗體恢復到原始大小和位置。應用程序當恢復一個最小化的窗體時將指定標記。 5 SW_SHOW 以當前的大小和位置激活並顯示窗體。 6 SW_SHOWDEFAULT 7 SW_SHOWMAXIMIZED 激活並最大化顯示窗體。 8 SW_SHOWMINIMIZED 激活並最小化現實窗體。 9 SW_SHOWMINNOACTIVE 最小化窗體,保持其激活狀態。 10 SW_SHOWNA 以當前狀態顯示窗體,保持其激活狀態。 11 SW_SHOWNOACTIVATE 以當前的大小和位置顯示窗體,並保持其激活狀態。 12 SW_SHOWNORMAL 激活並顯示一個窗體。如果窗體爲最大化或者最小化,窗體恢復到原始的大小和位置。當窗體第一次顯示的時候,應用程序記錄標記。 如果lpField指定的是一個文檔文件,lpParameters應該爲null。 lpDirectory 以一個以null結束的字符串指定文件開始運行的默認目錄。 nShowCmd 如果lpField指定了一個可執行文件,nShowCmd指定這個文件在被打開時如何顯示。這個參數可以是以下值中的任何一個: 如果lpField指定的是文檔文件,nShowCmd應該爲0。 * return Values(返回值) 如果函數執行成功,返回值是已經運行的工程的實例句柄,或者動態數據交換服務器應用程序的句柄。 (具體返回值列表從略,請參考Delphi在線幫助) * Remarks(註釋) 被lpFile參數指定的文件必須是一個可執行文件或者文檔文件。如果文件是一個文檔文件,ShellExecute函數將根據lpOperation參數決定打開或者打印這個文件。如果是可執行文件,ShellExecute函數將打開它,即使lpOperation參數被指定爲printing。 你可以使用ShellExecute打開活着搜索一個文件夾。可以使用以下任意一種方式打開一個文件夾: ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL); 或者 ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL); 使用下面的調用搜索文件夾: ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL) 如果lpOperation參數爲null,函數將打開由lpFile指定的文件。如果lpOperation參數爲”open”或者”explore”,函數將強制打開窗體或者資源管理器。 注:在新窗口打開網頁的辦法 ShellExecute(self.Handle, PChar('open'), PChar('explorer'), PChar(URL), nil, SW_MAXIMIZE); Q: 如何打開一個應用程序? ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW) ; 或 ShellExecute(this->m_hWnd,"open","notepad.exe", "c:/MyLog.log","",SW_SHOW); Q: 如何打開一個同系統程序相關連的文檔? ShellExecute(this->m_hWnd,"open", "c:/abc.txt","","",SW_SHOW); Q: 如何打開一個網頁? ShellExecute(this->m_hWnd,"open","http://www.google.com";,"","", SW_SHOW); Q: 如何激活相關程序,發送EMAIL? ShellExecute(this->m_hWnd,"open", "mailto:[email protected]","","", SW_SHOW); Q: 如何用系統打印機打印文檔? ShellExecute(this->m_hWnd,"print", "c:/abc.txt","","", SW_HIDE); Q: 如何用系統查找功能來查找指定文件? ShellExecute(m_hWnd,"find","d:/nish", NULL,NULL,SW_SHOW); Q: 如何啓動一個程序,直到它運行結束? SHELLEXECUTEINFO ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = "c:/MyProgram.exe"; ShExecInfo.lpParameters = ""; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); WaitForSingleObject(ShExecInfo.hProcess,INFINITE); 或: PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; //入口參數 ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof StartupInfo ; //分配大小 if(CreateProcess("c:/winnt/notepad.exe", NULL, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo)) { WaitForSingleObject(ProcessInfo.hProcess,INFINITE); CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); } else { MessageBox("The process could not be started..."); } Q: 如何顯示文件或文件夾的屬性? 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); |
底層應用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.