API函數ShellExecute與ShellExecuteEx用法


ShellExecute:

1.函數功能:
你可以給它任何文件的名字,它都能識別出來並打開它。
2.函數原型:

HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
); 

3.參數說明:
hwnd:
用於指定父窗口句柄。當函數調用過程出現錯誤時,它將作為Windows消息窗口的父窗口。
lpOperation:
用於指定要進行的操作。
“open”操作表示執行由lpFile參數指定的程序,或打開由lpFile參數指定的文件或文件夾;
“print”操作表示打印由lpFile參數指定的文件;
“explore”操作表示瀏覽由lpFile參數指定的文件夾。
當參數設為NULL時,表示執行默認操作“open”。
lpFile:
用於指定要打開的文件名、要執行的程序文件名或要瀏覽的文件夾名。
lpParameters:
若lpFile參數是一個可執行程序,則此參數指定命令行參數,否則此參數應為NULL.
lpDirectory:
用於指定默認目錄.
nShowCmd:
若lpFile參數是一個可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數應設置為0。
這個參數常用的常數:

SW_HIDE 隱藏窗口,活動狀態給令一個窗口
SW_MINIMIZE 最小化窗口,活動狀態給令一個窗口
SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態
SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態
SW_SHOWMAXIMIZED 最大化窗口,並將其激活
SW_SHOWMINIMIZED 最小化窗口,並將其激活
SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口
SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口
SW_SHOWNORMAL 與SW_RESTORE相同
若ShellExecute函數調用成功,則返回值為被執行程序的實例句柄。若返回值小於32,則表示出現錯誤。
SW_HIDE 隱藏窗口,活動狀態給另一個窗口 
  SW_MINIMIZE 最小化窗口,活動狀態給另一個窗口 
  SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態 
  SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態 
  SW_SHOWMAXIMIZED 最大化窗口,並將其激活 
  SW_SHOWMINIMIZED 最小化窗口,並將其激活 
  SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口 
  SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口 
  SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口 
  SW_SHOWNORMAL 與SW_RESTORE相同

ShowCmd 參數可選值:SW_HIDE = 0; {隱藏}
SW_SHOWNORMAL = 1; {用最近的大小和位置顯示, 激活}
SW_NORMAL = 1; {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED = 2; {最小化, 激活}
SW_SHOWMAXIMIZED = 3; {最大化, 激活}
SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE = 4; {用最近的大小和位置顯示, 不激活}
SW_SHOW = 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE = 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}
SW_MAX = 10; {同 SW_SHOWNORMAL}
View Code

4.使用方法:
例如:
ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);
用缺省的位圖編輯器打開一個叫iloveu.bmp的位圖文件,這個缺省的位圖編輯器可能是 Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。
這個函數能打開任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系統注冊表HKEY_CLASSES_ROOT中所有的內容,判斷啟動那一個執行程序,並且啟動一個新的實例或使用DDE將文件名連到一打開的實例。然后,ShellExecute 返回打開文件的應用的實例句柄。
ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL);
這個代碼使你能訪問微軟的主頁。當ShellExecute遇到文件名前面的“http:”時,可以判斷出要打開的文件是Web文件,隨之啟動Internet Explorer 或者 Netscape Navigator 或者任何你使用的別的瀏覽器打開文件。
ShellExecute還能識別其它協議,象FTP、GOPHER。甚至識別“mailto”,如果文件名指向“mailto:zxn@hq.cninfo.net”,它啟動電子郵件程序並打開一個待編輯的新郵件,例如:
ShellExecute(NULL, "open",“mailto:zxn@hq.cninfo.net”, NULL, NULL, SW_SHOWNORMAL);打開新郵件窗口。
總之,ShellExecute函數就是如此簡單地打開磁盤文件和Internet文件。如果將第二個參數“OPEN”改為“PRINT”或者“EXPLORE”,ShellExecute將能打印文件和打開文件夾。ShellExecute還有一個擴展函數ShellExecuteEx,所帶參數中有一個特殊的結構,功能更強,或者任何你使用的別的瀏覽器打開文件。
==========================================================================================================================
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:nishinapp@yahoo.com","","", 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; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
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:\"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);

Windows CE ShellExecuteEx 不支持 SEE_MASK_IDLIST 或 SEE_MASK_INVOKEIDLIST 標志。 因此,不能使用通過調用系統文件夾中打開 Windows 資源管理器的 SHGetSpecialFolderLocation 所得到的 LPITEMIDLIST。
相反,使用下面的類 ID,您要打開調用 ShellExecuteEx 時的系統文件夾:
Control Panel - {000314FE-0000-0000-C000-000000000046}
My Computer - {000214A0-0000-0000-C000-000000000046}
Recycle Bin - {000214A1-0000-0000-C000-000000000046}
Databases - {000214A4-0000-0000-C000-000000000046}
您可以在控制面板文件夾中打開 Windows 資源管理器的實例使用以下函數。 請注意 CLSID 必須被括在引號。

BOOL WINAPI OpenControlPanel ()
{
TCHAR szControlPanel[] = L"""
{000314FE-0000-0000-C000-000000000046}""";
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof (SHELLEXECUTEINFO);
sei.lpVerb = L"Open";
sei.lpFile = szControlPanel;
sei.nShow = SW_SHOW;
sei.hInstApp = hInstance;
return ShellExecuteEx (&sei);
}

示例:
1:打開EXE

SHELLEXECUTEINFO lpExecInfo = {0};
lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
lpExecInfo.lpVerb = L"Open"; 
lpExecInfo.hwnd = NULL; 
lpExecInfo.lpFile = L"calc.exe";
lpExecInfo.lpDirectory = L"\\windows"; 
lpExecInfo.nShow = SW_SHOW; 
lpExecInfo.lpParameters = NULL; 
lpExecInfo.hInstApp = NULL; 
ShellExecuteEx(&lpExecInfo);
View Code

2:打開指定文件夾

SHELLEXECUTEINFO lpExecInfo = {0};
lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
lpExecInfo.lpVerb = L"Open"; 
lpExecInfo.hwnd = NULL; 
lpExecInfo.lpFile = L"fexplore.exe";
lpExecInfo.lpDirectory = NULL;//L"\\windows"; 
lpExecInfo.nShow = SW_SHOW; 
lpExecInfo.lpParameters = L"\\Windows\\“開始”菜單\\程序"; 
lpExecInfo.hInstApp = NULL; 
ShellExecuteEx(&lpExecInfo);
View Code

Q: 如何打開一個應用程序?

ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );或 
ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );正如您所看到的,我並沒有傳遞程序的完整路徑。
View Code

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:nishinapp@yahoo.com","","", 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; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
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...");
}
View Code

Q: 如何顯示文件或文件夾的屬性?

SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c:\\"; //can be a file as well
ShExecInfo.lpParameters = ""; 
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL; 
ShellExecuteEx(&ShExecInfo);
View Code

如何判斷通過ShellExecute執行的應用程序已經執行完畢
方法一:

SHELLEXECUTEINFO sei; 
memset(&sei, 0, sizeof(SHELLEXECUTEINFO));

sei.cbSize = sizeof(SHELLEXECUTEINFO); 
sei.fMask = SEE_MASK_NOCLOSEPROCESS; 
sei.lpVerb = _T("open"); 
sei.lpFile = _T("aa.exe"); 
sei.nShow = SW_SHOWDEFAULT; 
ShellExecuteEx(&sei);

WaitForSingleObject(sei.hProcess, INFINITE); 
CloseHandle(sei.hProcess); 
View Code

方法二:

//通過CreateProcess創建一個進程,然后進行等待。
STARTUPINFO si; 
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) ); 
si.cb = sizeof(si); 
ZeroMemory( &pi, sizeof(pi) );

// 創建子進程 
if( !CreateProcess( NULL, // No module name (use command line). 
"MyChildProcess", // Command line. 
NULL, // Process handle not inheritable. 
NULL, // Thread handle not inheritable. 
FALSE, // Set handle inheritance to FALSE. 
0, // No creation flags. 
NULL, // Use parent's environment block. 
NULL, // Use parent's starting directory. 
&si, // Pointer to STARTUPINFO structure. 
&pi ) // Pointer to PROCESS_INFORMATION structure. 
) 
{ 
ErrorExit( "CreateProcess failed." ); 
}

// 等待子進程退出 
WaitForSingleObject( pi.hProcess, INFINITE );

// 關閉句柄 
CloseHandle( pi.hProcess ); 
CloseHandle( pi.hThread );
View Code

 

WinAPI: ShellExecute - 打開外部程序或文件
ShellExecute(
hWnd: HWND; {指定父窗口句柄} Operation: PChar; {指定動作, 譬如: open、runas、print、edit、explore、find } FileName: PChar; {指定要打開的文件或程序} Parameters: PChar; {給要打開的程序指定參數; 如果打開的是文件這里應該是 nil} Directory: PChar; {缺省目錄} ShowCmd: Integer {打開選項} ): HINST; {執行成功會返回應用程序句柄; 如果這個值 <= 32, 表示執行錯誤}
返回值可能的錯誤有: = 0 {內存不足}

ERROR_FILE_NOT_FOUND = 2; {文件名錯誤}
ERROR_PATH_NOT_FOUND = 3; {路徑名錯誤}
ERROR_BAD_FORMAT = 11; {EXE 文件無效}
SE_ERR_SHARE = 26; {發生共享錯誤}
SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或無效}
SE_ERR_DDETIMEOUT = 28; {超時}
SE_ERR_DDEFAIL = 29; {DDE 事務失敗}
SE_ERR_DDEBUSY = 30; {正在處理其他 DDE 事務而不能完成該 DDE 事務}
SE_ERR_NOASSOC = 31; {沒有相關聯的應用程序}

SW_HIDE 隱藏窗口,活動狀態給令一個窗口
SW_MINIMIZE 最小化窗口,活動狀態給令一個窗口
SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態
SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態
SW_SHOWMAXIMIZED 最大化窗口,並將其激活
SW_SHOWMINIMIZED 最小化窗口,並將其激活
SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口
SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口
SW_SHOWNORMAL 與SW_RESTORE相同

//Operation參數可選值:
open:{操作表示執行由FileName參數指定的程序,或打開由FileName參數指定的文件或文件夾;}
runas:{runas是微軟未列入MSDN文檔的TOKEN,也就是以管理員模式運行為 } 
print:{操作表示打印由FileName參數指定的文件}
edit:{}
explore:{操作表示瀏覽由FileName參數指定的文件夾}
find:{}
nil:{當參數設為nil時,表示執行默認操作“open”}

//ShowCmd 參數可選值:
SW_HIDE = 0; {隱藏}
SW_SHOWNORMAL = 1; {用最近的大小和位置顯示, 激活}
SW_NORMAL = 1; {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED = 2; {最小化, 激活}
SW_SHOWMAXIMIZED = 3; {最大化, 激活}
SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE = 4; {用最近的大小和位置顯示, 不激活}
SW_SHOW = 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE = 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}
SW_MAX = 10; {同 SW_SHOWNORMAL}
View Code

//舉例說明更多問題(別忘了 uses ShellAPI;):
{譬如用記事本打開一個文件}

View Code

{第一個參數是用來當作錯誤提示窗口的父窗口的, 不能是 nil, 可以是 0(也就是桌面窗口)}

View Code

{第二個參數如果是 nil, 也會默認位 open}

View Code

{文件路徑可以放在參數五}

View Code

{把參數三直接指定為要打開的文件, 文件將用對應默認程序打開; 次數參數四應為 nil}

View Code

{如果文件在: 程序目錄/當前目錄/System32/Windows/PATH環境變量中, 參數五也可以 nil}

View Code

{如果參數三是個文件, 可以用參數二命令打印}

View Code

{用 IE 打開網頁}

View Code

{用火狐打開網頁}

View Code

{用默認瀏覽器打開網頁}

View Code

{還是用默認瀏覽器打開網頁}

View Code

 調出windows任務管理器

delphi 如何調出windows任務管理器
uses shellapi;
begin
ShellExecute (HWND(nil), 'open', 'taskmgr', '', '', SW_SHOWNORMAL);
end;
View Code

啟動和關閉外部應用程序

⑴ 要啟動外部應用程序,可以通過調用api函數winexec來實現。該函數用於運行指定的應用程序。下面介紹一下該函數所需的參數和返回值:
uint winexec(
 lpcstr lpcmdline, file://命令行指針
 uint ucmdshow file://應用程序的窗口風格
);
  如果成功,返回值大於31。否則可能返回下列結果:
  0 系統內存或資源不足
  error_bad_format 該*.exe文件無效
  error_file_not_found 沒找到指定的文件
  error_path_not_found 沒找到指定路徑
  ⑵ 通過編寫標題為“啟動外部應用程序”組件的onclick事件,來實現外部應用程序的啟動,代碼如下:
procedure tform1.button1click(sender: tobject);
var
str: string; file://存儲指定的應用程序文件名begin
if opendialog1.execute then file://選擇要調用的外部可執行程序
begin
str := opendialog1.filename; file://獲取可執行文件名
winexec(pchar(str), sw_shownormal); file://啟動指定的可執行程序
end;
end;
  3. 關閉已開啟的外部應用程序
  ⑴ 通過調用兩個api函數,可以實現該功能。這兩個函數分別為:
  ① findwindow函數 該函數用於查找與指定的類名和窗口名相匹配的高層窗口,如果查找成功,返回非0值,否則返回0。
  ② sendmessage函數 此函數向一個或多個窗口發送指定的消息。在此通過發送wm_close消息來關閉指定的外部應用程序。
  ⑵ 通過編寫標題為“關閉已開啟的外部應用程序”組件的onclick事件,來關閉已開啟的外部應用程序。代碼如下:
procedure TmainForm.Button1Click(Sender: TObject);
var
  hwndclose: hwnd; //存儲指定的外部應用程序窗口句柄
  str: string; //存儲指定的外部應用程序的窗口名
begin
  str:= inputbox('提示','請輸入應用程序名:',''); //file://獲取要關閉的應用程序窗口名
  if str <>'' then
  begin
  //根據窗口名查找要關閉的窗口句柄
  hwndclose := findwindow(nil, pchar(str));
  if hwndclose <> 0 then //如果查找成功,則發送消息,關閉指定的窗口
  begin
    sendmessage(hwndclose,wm_close,0,0);
  end
  else //否則,給出提示信息
  begin
    showmessage('沒找到指定的應用程序,所以無法關閉!');
  end;
end;
end;
View Code

等待執行完一個外部程序再執行另一個程序

View Code

調用外部程序的集中方法

Delphi調用外部程序

WinExec主要運行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);

WinExec(
  lpCmdLine: LPCSTR; {文件名和參數; 如沒指定路徑會按以下順序查找: 程序目錄/當前目錄/System32/Windows/PATH環境變量}
  uCmdShow: UINT     {啟動選項}
): UINT;

//返回值:
大於 31                    {調用成功}
等於 0                     {內存不足}
ERROR_FILE_NOT_FOUND = 2;  {文件名錯誤}
ERROR_PATH_NOT_FOUND = 3;  {路徑名錯誤}
ERROR_BAD_FORMAT     = 11; {EXE 文件無效}

//uCmdShow 參數可選值:
SW_HIDE            = 0; {隱藏, 並且任務欄也沒有最小化圖標}
SW_SHOWNORMAL      = 1; {用最近的大小和位置顯示, 激活}
SW_NORMAL          = 1; {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED   = 2; {最小化, 激活}
SW_SHOWMAXIMIZED   = 3; {最大化, 激活}
SW_MAXIMIZE        = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE  = 4; {用最近的大小和位置顯示, 不激活}
SW_SHOW            = 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE        = 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA          = 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE         = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT     = 10; {同 SW_SHOWNORMAL}
SW_MAX             = 10; {同 SW_SHOWNORMAL}


ShellExecute不僅可以運行EXE文件,也可以運行已經關聯的文件。
首先必須引用shellapi.pas單元:uses ShellAPI; 

1.標准用法 
  ShellExecute函數原型及參數含義如下: 
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall; 
  ●hWnd:用於指定父窗口句柄。當函數調用過程出現錯誤時,它將作為Windows消息窗口的父窗口。例如,可以將其設置為應用程序主窗口句柄,即 Application.Handle,也可以將其設置為桌面窗口句柄(用GetDesktopWindow函數獲得)。 
  ●Operation:用於指定要進行的操作。其中“open”操作表示執行由FileName參數指定的程序,或打開由FileName參數指定的文件或文件夾;“print”操作表示打印由FileName參數指定的文件;“explore”操作表示瀏覽由FileName參數指定的文件夾。當參數設為nil時,表示執行默認操作“open”。 
  ●FileName:用於指定要打開的文件名、要執行的程序文件名或要瀏覽的文件夾名。 
  ●Parameters:若FileName參數是一個可執行程序,則此參數指定命令行參數,否則此參數應為nil或PChar(0)。 
  ●Directory:用於指定默認目錄。 
  ●ShowCmd:若FileName參數是一個可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數應設置為0。
  若ShellExecute函數調用成功,則返回值為被執行程序的實例句柄。若返回值小於32,則表示出現錯誤。 
  上述僅僅是ShellExecute函數的標准用法,下面將介紹它的特殊用法。 

2.特殊用法 
  如果將FileName參數設置為“http:”協議格式,那么該函數將打開默認瀏覽器並鏈接到指定的URL地址。若用戶機器中安裝了多個瀏覽器,則該函數將根據Windows 9x/NT注冊表中http協議處理程序(Protocols Handler)的設置確定啟動哪個瀏覽器。 
  格式一:http://網站域名。 
  如:ShellExecute(handle, ‘open’, http:// ;  http://www.neu.edu.cn/’/, nil, nil, SW_SHOWNORMAL); 
  格式二:http://網站域名/網頁文件名。 
  如:ShellExecute(handle, ‘open’, http://;  www.neu.edu.cn/default.htm’,nil,nil,  SW_SHOWNORMAL); 
  如果將FileName參數設置為“mailto:”協議格式,那么該函數將啟動默認郵件客戶程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶機器中安裝了多個郵件客戶程序,則該函數將根據Windows 9x/NT注冊表中mailto協議處理程序的設置確定啟動哪個郵件客戶程序。 
  格式一:mailto: 
  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口。 
  格式二:mailto:用戶賬號@郵件服務器地址 
  如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同)。 
  格式三:mailto:用戶賬號@郵件服務器地址?subject=郵件主題&body=郵件正文 
  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字符%0a。 
例子(delphi): 
在一個應用程序調用c:Project1.exe; 
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串內容’,nil, SW_SHOWNORMAL); 
在Project1.exe里可以調用: 
procedure TForm1.FormCreate(Sender: TObject); 
var i:integer; 
begin 
for i:=1 to paramcount do 
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i)); 
end;

最后的那個參數,為窗口指定可視性方面的一個命令。 
請用下述任何一個常數 
SW_HIDE 隱藏窗口,活動狀態給令一個窗口 
SW_MINIMIZE 最小化窗口,活動狀態給令一個窗口 
SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態 
SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態 
SW_SHOWMAXIMIZED 最大化窗口,並將其激活 
SW_SHOWMINIMIZED 最小化窗口,並將其激活 
SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口 
SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口 
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口 
SW_SHOWNORMAL 與SW_RESTORE相同 

 function   ShellExecuteEx(lpExecInfo:   PShellExecuteInfo):BOOL;   stdcall;   
 //使用一個結構傳遞參數,可以得到被調用者的進程句柄,可以用WaitForSingleObject(lpExecInfo^.hProcess,INFINITE)來等待它結束

 如果要得到被運行的程序的進程句柄,以便於等待它結束再繼續執行,就要用ShellExecuteEx,CreateProcess和CreateProcessAsUser。
View Code

ShellExecute的妙用

ShellExecute的功能是運行一個外部程序(或者是打開一個已注冊的文件、打開一個目錄、打印一個文件等等),並對外部程序有一定的控制。
有幾個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://bbs.e-0631.cn'), 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);
運行一個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://bbs.e-0631.cn";,"","",  SW_SHOW);
 Q: 如何激活相關程序,發送EMAIL?
 ShellExecute(this->m_hWnd,"open","mailtnishinapp@yahoo.com","","", 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
View Code
有三個API函數可以運行可執行文件WinExec、ShellExecute和CreateProcess。CreateProcess因為使用復雜,比較少用。  


WinExec主要運行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);  
ShellExecute不僅可以運行EXE文件,也可以運行已經關聯的文件。 
首先必須引用shellapi.pas單元:uses ShellAPI;  


1.標准用法  
  ShellExecute函數原型及參數含義如下:  
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;  
  ●hWnd:用於指定父窗口句柄。當函數調用過程出現錯誤時,它將作為Windows消息窗口的父窗口。例如,可以將其設置為應用程序主窗口句柄,即Application.Handle,也可以將其設置為桌面窗口句柄(用GetDesktopWindow函數獲得)。  
  ●Operation:用於指定要進行的操作。其中“open”操作表示執行由FileName參數指定的程序,或打開由FileName參數指定的文件或文件夾;“print”操作表示打印由FileName參數指定的文件;“explore”操作表示瀏覽由FileName參數指定的文件夾。當參數設為nil時,表示執行默認操作“open”。  
  ●FileName:用於指定要打開的文件名、要執行的程序文件名或要瀏覽的文件夾名。  
  ●Parameters:若FileName參數是一個可執行程序,則此參數指定命令行參數,否則此參數應為nil或PChar(0)。  
  ●Directory:用於指定默認目錄。  
  ●ShowCmd:若FileName參數是一個可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數應設置為0。  
  若ShellExecute函數調用成功,則返回值為被執行程序的實例句柄。若返回值小於32,則表示出現錯誤。  
  上述僅僅是ShellExecute函數的標准用法,下面將介紹它的特殊用法。  


2.特殊用法  
  如果將FileName參數設置為“http:”協議格式,那么該函數將打開默認瀏覽器並鏈接到指定的URL地址。若用戶機器中安裝了多個瀏覽器,則該函數將根據Windows 9x/NT注冊表中http協議處理程序(Protocols Handler)的設置確定啟動哪個瀏覽器。  
  格式一:http://網站域名。  
  如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);  
  格式二:http://網站域名/網頁文件名。  
  如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn/default.htm’,nil,nil,       SW_SHOWNORMAL);  
  如果將FileName參數設置為“mailto:”協議格式,那么該函數將啟動默認郵件客戶程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶機器中安裝了多個郵件客戶程序,則該函數將根據Windows 9x/NT注冊表中mailto協議處理程序的設置確定啟動哪個郵件客戶程序。  
  格式一:mailto:  
  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口。  
  格式二:mailto:用戶賬號@郵件服務器地址  
  如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同)如:ShellExecute(this->m_hWnd,"open",   
             "mailto:nishinapp@yahoo.com","","",      SW_SHOW      );這個可以激活Outlook       Express。  
  格式三:mailto:用戶賬號@郵件服務器地址?subject=郵件主題&body=郵件正文  
  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字符%0a。  
例子(delphi):  
在一個應用程序調用c:Project1.exe;  
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串內容’,nil, SW_SHOWNORMAL);  
在Project1.exe里可以調用:  
procedure TForm1.FormCreate(Sender: TObject);  
var i:integer;  
begin  
for i:=1 to paramcount do  
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i));  
end; 


最后的那個參數,為窗口指定可視性方面的一個命令。  
請用下述任何一個常數  
SW_HIDE 隱藏窗口,活動狀態給令一個窗口  
SW_MINIMIZE 最小化窗口,活動狀態給令一個窗口  
SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態  
SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態  
SW_SHOWMAXIMIZED 最大化窗口,並將其激活  
SW_SHOWMINIMIZED 最小化窗口,並將其激活  
SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口  
SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口  
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口  
SW_SHOWNORMAL 與SW_RESTORE相同


深入淺出ShellExecute     
    
      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:nishinapp@yahoo.com","","",       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;       //This       is       an       [in]       parameter   
      ZeroMemory(&StartupInfo,       sizeof(StartupInfo));   
      StartupInfo.cb       =       sizeof       StartupInfo       ;       //Only       compulsory       field   
      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:\\";       //can       be       a       file       as       well   
      ShExecInfo.lpParameters       =       "";     
      ShExecInfo.lpDirectory       =       NULL;   
      ShExecInfo.nShow       =       SW_SHOW;   
      ShExecInfo.hInstApp       =       NULL;     
      ShellExecuteEx(&ShExecInfo);   




     附:一些windows的系統命令:


winver---------檢查Windows版本 
wmimgmt.msc----打開windows管理體系結構(WMI) 
wupdmgr--------windows更新程序 
wscript--------windows腳本宿主設置 
write----------寫字板 
winmsd---------系統信息 
wiaacmgr-------掃描儀和照相機向導 
winchat--------XP自帶局域網聊天 


mem.exe--------顯示內存使用情況 
Msconfig.exe---系統配置實用程序 
mplayer2-------簡易widnows media player 
mspaint--------畫圖板 
mstsc----------遠程桌面連接 
mplayer2-------媒體播放機 
magnify--------放大鏡實用程序 
mmc------------打開控制台 
mobsync--------同步命令 


dxdiag---------檢查DirectX信息 
drwtsn32------ 系統醫生 
devmgmt.msc--- 設備管理器 
dfrg.msc-------磁盤碎片整理程序 
diskmgmt.msc---磁盤管理實用程序 
dcomcnfg-------打開系統組件服務 
ddeshare-------打開DDE共享設置 
dvdplay--------DVD播放器 


net stop messenger-----停止信使服務 
net start messenger----開始信使服務 
notepad--------打開記事本 
nslookup-------網絡管理的工具向導 
ntbackup-------系統備份和還原 
narrator-------屏幕“講述人” 
ntmsmgr.msc----移動存儲管理器 
ntmsoprq.msc---移動存儲管理員*作請求 
netstat -an----(TC)命令檢查接口 


syncapp--------創建一個公文包 
sysedit--------系統配置編輯器 
sigverif-------文件簽名驗證程序 
sndrec32-------錄音機 
shrpubw--------創建共享文件夾 
secpol.msc-----本地安全策略 
syskey---------系統加密,一旦加密就不能解開,保護windows xp系統的雙重密碼 
services.msc---本地服務設置 
Sndvol32-------音量控制程序 
sfc.exe--------系統文件檢查器 
sfc /scannow---windows文件保護 


tsshutdn-------60秒倒計時關機命令 
tourstart------xp簡介(安裝完成后出現的漫游xp程序) 
taskmgr--------任務管理器 


eventvwr-------事件查看器 
eudcedit-------造字程序 
explorer-------打開資源管理器 


packager-------對象包裝程序 
perfmon.msc----計算機性能監測程序 
progman--------程序管理器 


regedit.exe----注冊表 
rsop.msc-------組策略結果集 
regedt32-------注冊表編輯器 
rononce -p ----15秒關機 
regsvr32 /u *.dll----停止dll文件運行 
regsvr32 /u zipfldr.dll------取消ZIP支持 


cmd.exe--------CMD命令提示符 
chkdsk.exe-----Chkdsk磁盤檢查 
certmgr.msc----證書管理實用程序 
calc-----------啟動計算器 
charmap--------啟動字符映射表 
cliconfg-------SQL SERVER 客戶端網絡實用程序 
Clipbrd--------剪貼板查看器 
conf-----------啟動netmeeting 
compmgmt.msc---計算機管理 
cleanmgr-------好東西整理 
ciadv.msc------索引服務程序 


osk------------打開屏幕鍵盤 
odbcad32-------ODBC數據源管理器 
oobe/msoobe /a----檢查XP是否激活 
lusrmgr.msc----本機用戶和組 
logoff---------注銷命令 


iexpress-------木馬捆綁工具,系統自帶 


Nslookup-------IP地址偵測器 


fsmgmt.msc-----共享文件夾管理器 


utilman--------輔助工具管理器 


gpedit.msc-----組策略 
xp下運行命令大全. 


$Systemroot$Documents and Settingsusername 目錄下 


appwiz.cpl------------添加刪除程序 


control userpasswords2--------用戶帳戶設置 


cleanmgr-------垃圾整理 


CMD--------------命令提示符可以當作是 Windows 的一個附件,Ping,Convert 這些不能在圖形環境下 使用的功能要借助它來完成。 


cmd------jview察看Java虛擬機版本。 


command.com------調用的則是系統內置的 NTVDM,一個 DOS虛擬機。它完全是一個類似 Virtual PC 的 虛擬環境,和系統本身聯系不大。當我們在命令提示符下運行 DOS 程序時,實際上也 是自動轉移到 NTVDM虛擬機下,和 CMD 本身沒什么關系。 


calc-----------啟動計算器 


chkdsk.exe-----Chkdsk磁盤檢查 


compmgmt.msc---計算機管理 


conf-----------啟動 netmeeting 


control userpasswords2-----User Account 權限設置 


devmgmt.msc--- 設備管理器 


diskmgmt.msc---磁盤管理實用程序 


dfrg.msc-------磁盤碎片整理程序 


drwtsn32------ 系統醫生 


dvdplay--------啟動Media Player 


dxdiag-----------DirectX Diagnostic Tool 


gpedit.msc-------組策略編輯器 


gpupdate /target:computer /force 強制刷新組策略 


eventvwr.exe-----事件查看器 


explorer-------打開資源管理器 


logoff---------注銷命令 


lusrmgr.msc----本機用戶和組 


msinfo32---------系統信息 


msconfig---------系統配置實用程序 


net start (servicename)----啟動該服務 


net stop (servicename)-----停止該服務 


notepad--------打開記事本 


nusrmgr.cpl-------同control userpasswords,打開用戶帳戶控制面板 


Nslookup-------IP地址偵測器 


oobe/msoobe /a----檢查XP是否激活 


perfmon.msc----計算機性能監測程序 


progman--------程序管理器 


regedit----------注冊表編輯器 


regedt32-------注冊表編輯器 


regsvr32 /u *.dll----停止dll文件運行 


route print------查看路由表 


rononce -p ----15秒關機 


rsop.msc-------組策略結果集 


rundll32.exe rundll32.exe %Systemroot%System32shimgvw.dll,ImageView_Fullscreen----啟動一個空白的Windows 圖片和傳真查看器 


secpol.msc--------本地安全策略 


services.msc---本地服務設置 


sfc /scannow-----啟動系統文件檢查器 


sndrec32-------錄音機 


taskmgr-----任務管理器(適用於2000/xp/2003) 


tsshutdn-------60秒倒計時關機命令 


winchat--------XP自帶局域網聊天 


winmsd---------系統信息 


winver-----顯示About Windows 窗口


Windows XP的關機是由Shutdown.exe程序來控制的,位於Windows\System32文件夾中。如果想讓Windows 2000也實現同樣的效果,可以把Shutdown.exe復制到系統目錄下。 


比如你的電腦要在22:00關機,可以選擇“開始→運行”,輸入“at 22:00 Shutdown -s”, 這樣,到了22點電腦就會出現“系統關機”對話框,默認有30秒鍾的倒計時並提示你保存工作。如果你想以倒計時的方式關機,可以輸入“Shutdown.exe -s -t 3600”,這里表示60 分鍾后自動關機,“3600”代表60分鍾。 


設置好自動關機后,如果想取消的話,可以在運行中輸入“shutdown -a”。另外輸入“shutdown -i”,則可以打開設置自動關機對話框,對自動關機進行設置。 


Shutdown.exe的參數,每個都具有特定的用途,執行每一個都會產生不同的效果,比如 “-s”就表示關閉本地計算機,“-a”表示取消關機操作,下面列出了更多參數, 可以在Shutdown.exe中按需使用。 


-f:強行關閉應用程序 


-m \\計算機名:控制遠程計算機 


-i:顯示圖形用戶界面,但必須是Shutdown的第一個選項 


-l:注銷當前用戶 


-r:關機並重啟 


-t 時間:設置關機倒計時 


-c "消息內容":輸入關機對話框中的消息內容(不能超127個字符) 


有時候,我們需要定時關閉計算機,下面介紹一個在Windows XP下實現定時關機的簡單方法。 


指定系統在22分鍾后自動關閉:點擊“開始→運行”,在“打開”中輸入命令“Shutdown -s -t 1320”(注意:引號不輸入,參數之間有空格,1320的單位是秒),單擊“確定” 
按鈕即可。 


指定系統在某個時間(比如12:00)自動關閉:在“打開”中輸入命令 
“at 1200 Shutdown -s”即可。 


取消定時關機:在“打開”中輸入命令“Shutdown -a”即可。
View Code

關閉外部獲得到外部exe文件進程句柄

ShellExecute問題   
大家知道,在一個大型復雜的系統中,有時會調用一些外部程序來幫助我們完成某些特定功能。然而,如何打開並關閉這些外部程序呢?也許,這是一個老生常談的話題,但筆者仍要繼續討論這個問題,原因有二:一是解決這個問題的方法很重要,並經常會遇到;二是大多數參考書提及的解決辦法不全面,仍有很多朋友有疑問。下面,我將詳細地闡述這個問題(提供的源代碼均在WinNT/Delphi4.0環境下運行通過)。 

一、如何打開一個外部程序:
我們常用的函數有兩個,WinExec,ShellExecute,因為ShellExecute函數主要用於Win32下,功能也強大一些,故而本文只對后者進行討論。

首先,我們粗略地研究一下ShellExecute的幾個參數:
hwnd:窗體的句柄; 
lpOperation:打開程序執行的操作,共預留有"open","explore","print"三種方式,此參數可以省略,此時將依據打開的文件(lpFile)的類型執行相應的操作,比如:如果lpFile為一文本文件,那么將會在與該文件相關聯的程序中打開它; 
lpFile:文件名; 
lpParamerters:打開文件時所需的參數; 
lpDirectory:文件名所在的路徑,當然,一般來說,在Windows中登 
記過的程序(如WinWord)不必提供此參數; 
nShowCmd:打開文件后程序窗體如何顯示。 
該函數的詳細文檔請讀者朋友參閱相應幫助。

其次,我們來舉一個例子(以"記事本"為例): 
procedure TForm1.OpenBtnClick(Sender:TObject); 
begin 
ShellExecute(handle,'open','notepad.exe',nil,nil,SW_ShowNormal); 
end; 
讀者朋友可以在你的Delphi環境下試試這段代碼,當然,由於使用Windows的API函數,請加上ShellAPI單元。

獲得到外部exe文件進程句柄
二、如何關閉打開的外部程序: 
要關閉一個外部程序,只需向他發送一條消息就行了,比如,SendMessage(ExeHandle,WM_Close,0,0);其中ExeHandle是程序窗體的句柄,但如何得到窗體句柄呢?這是最為關鍵的地方,幸好Windows提供了FindWindow()函數,它能夠解決這個問題,它有兩個參數:lpClassName:程序的類名;lpWindowName:程序窗體的標題。

第一種情況也是最簡單情況的就是提供確定的[*"確定的"加着重號*] 
"lpWindowName"參數,如下例: 
procedure TForm1.CloseAppClick(Sender: TObject);//確定標題 
var
Exehandle:Thandle; 
begin
//獲得句柄-->標題確定 
ExeHandle:=findWindow(nil,'文件管理器');//返回句柄 
//關閉程序
if ExeHandle<>0 then 
SendMessage(ExeHandle,WM_Close,0,0) 
Else 
Application.MessageBox('沒有打開"文件管理器"!','提示', 
MB_IconInformation+MB_OK); 
end; 

另一種情況是程序窗體沒有確定的[*"沒有確定的"加着重號*]標題,這就是很多朋友出現疑問的地方,也是幾乎所有參考書均不涉及的地方。比如打開"寫字板"程序,它的標題會隨着文本文件名的不同而不同,此時,你要關閉它,就不得不提供程序的類名,但是如何獲得程序的類名呢?筆者在這里向大家介紹一個可行的辦法:首先打開程序(此處以"記事本"為例),然后,運行WinSight32(Delphi自帶程序)或Spy++(VC自帶程序[菜單:監視-查找窗口]),找到程序( "記事本")的運行狀態,即可找到我們需要的類名(兩者均為"Class Name"項)。參考一個例子: 
procedure TForm1.CloseVAppClick(Sender: TObject);//標題不確定 
var 
var 
ExeHandle:Thandle; 
Begin 
//獲得句柄-->標題不確定 
ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄 
//關閉程序 
if ExeHandle<>0 then 
SendMessage(ExeHandle,WM_Close,0,0) 
Else 
Application.MessageBox('沒有打開"記事本"程序!','提示', 
MB_IconInformation+MB_OK); 
end; 

當然,既能提供程序的類名又能提供程序窗體的標題自然就沒有討論的必要了。這樣,我們就可以在自己的程序中打開並關閉任意的外部程序了。另外,筆者在這里羅嗦一句:上文提到的ShellExeCute()還有有相當"豪華" 的用處!細心的讀者可能注意到有的作者的程序里提供了一些廣告他們的連接,這其實就是ShellExeCute()的運用之一,略舉一例: 
procedure TForm1.HttpClick(Sender: TObject); 
begin 
ShellExecute(handle,'open','http://liangming.163.net', 
nil,nil,SW_ShowNormal); 
end;  
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM