|
发表于 2016-8-5 10:44:30
|
显示全部楼层
其实要运行程序的话不一定非得调用系统的运行对话框,现成的 API 有好几个,CreateProcess、ShellExecute 等等。
如果非要调用运行对话框也不是不行!
Shell32.dll里有一个未公开的API,无函数名,序号为61,可以显示定制的运行对话框,
字符集要设成Unicode,否则可能会是乱码。
- /**************************************************************************************
- * 函数名称 : ShowMyRunDlg(...)
- * 功能描述 : 显示定制的运行对话框
- * 入 参 : HWND hWndOwner, //所有者窗口句柄
- HICON hIcon, //要显示的图标句柄
- PTCHAR pszDirectory, //“浏览”按钮的目录,该目录下的文件可省略路径
- PTCHAR pszTitle, //窗口标题的文字
- PTCHAR pszDescription, //窗口上的文本描述
- UINT nFlags //样式
- * 出 参 : 无
- * 返回值 : -1 失败 0 成功
- * 作 者 : 一剑
- * 创建日期 : 2012/07/31
- * 处理说明 : 显示定制的运行对话框
- *************************************************************************************/
- BOOL ShowMyRunDlg(HWND hWndOwner, HICON hIcon, PTCHAR pszDirectory,
- PTCHAR pszTitle, PTCHAR pszDescription, UINT nFlags)
- {
- /* 声明未公开的API函数原型,函数名称可任意指定 */
- typedef void (CALLBACK *lpfnRunDlg)(HWND, HICON, PTCHAR, PTCHAR, PTCHAR, UINT);
- HMODULE hModule = LoadLibrary(TEXT("Shell32.dll"));
- if(hModule != NULL)
- {
- lpfnRunDlg RunDlg = (lpfnRunDlg)GetProcAddress(hModule, (LPCSTR)MAKEINTRESOURCE(61));
- RunDlg(hWndOwner, hIcon, pszDirectory, pszTitle, pszDescription, nFlags);
- FreeLibrary(hModule);
- return TRUE;
- }
- return FALSE;
- }
复制代码
调用方法示例:
- ShowMyRunDlg(hwnd, LoadIcon(hAppInstance, MAKEINTRESOURCE(IDI_MAIN_ICON)),
- TEXT("C:\"), TEXT("窗口标题的文字"), TEXT("窗口上的文本描述"),
- WS_POPUPWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS|WS_DLGFRAME|WS_OVERLAPPED|
- DS_3DLOOK|DS_FIXEDSYS|DS_SETFONT|DS_MODALFRAME|DS_NOIDLEMSG);
复制代码 |
|