购买与咨询 NX 二次开发视频教程,请联系微信号:13890821008 QQ号:85585969
转自:https://blog.csdn.net/sihai12345/article/details/82744518
功能:想实现一个功能,点击一个按钮,打开显示一个文本文件。
我是这么写的:system("start D:1.txt" );但是打开时会有一个黑窗口,比较难看。那么能不能不显示这个窗口实现打开显示文本文件呢?可以用ShellExecute这个函数。
下面是这个函数的说明:
-----------------------------------割--------------------------------------------
使用 ShellExecute 打开文件或执行程序
可以使用 ShellExecute 打开文件或执行程序。
原型:
HINSTANCE ShellExecute(
_In_opt_ HWND hwnd,//父窗口句柄或出错时显示错误父窗口的句柄,可以为 NULL
_In_opt_ LPCTSTR lpOperation,//操作
_In_ LPCTSTR lpFile,//要打开的文件名、执行的程序名、浏览的文件夹等。
_In_opt_ LPCTSTR lpParameters,//可执行程序的参数,否则为 NULL
_In_opt_ LPCTSTR lpDirectory,//默认目录
_In_ INT nShowCmd//显示类型
);
lpOperation 是一个字符串,通常为:
edit 用编辑器打开 lpFile 指定的文档,如果 lpFile 不是文档,则会失败
explore 浏览 lpFile 指定的文件夹
find 搜索 lpDirectory 指定的目录
open 打开 lpFile 文件,lpFile 可以是文件或文件夹
print 打印 lpFile,如果 lpFile 不是文档,则函数失败
properties 显示属性
runas 请求以管理员权限运行,比如以管理员权限运行某个exe
NULL 执行默认”open”动作
nShowCmd 执行操作之后程序显示类型,指定该参数后运行起来的程序不一定能按照指定参数显示,只是通知程序的显示状态。类型如下:
SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同
返回值:
返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。错误如下:
0 系统内存或资源不足
ERROR_FILE_NOT_FOUND 找不到指定的文件
ERROR_PATH_NOT_FOUND 找不到指定路径
ERROR_BAD_FORMAT .exe文件无效
SE_ERR_ACCESSDENIED 拒绝访问指定文件
SE_ERR_ASSOCINCOMPLETE 文件名关联无效或不完整
SE_ERR_DDEBUSY DDE事务正在处理,DDE事务无法完成
SE_ERR_DDEFAIL DDE事务失败
SE_ERR_DDETIMEOUT 请求超时,无法完成DDE事务请求
SE_ERR_DLLNOTFOUND 未找到指定dll
SE_ERR_FNF 未找到指定文件
SE_ERR_NOASSOC 未找到与给的文件拓展名关联的应用程序,比如打印不可打印的文件等
SE_ERR_OOM 内存不足,无法完成操作
SE_ERR_PNF 未找到指定路径
SE_ERR_SHARE 发生共享冲突
怎样打开一个网页?
假设将FileName參数设置为http:
协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。
若用户机器中安装了多个浏览器,则该函数将依据Windows 9x/NT注冊表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。
如:ShellExecute(handle,L"open",L" http://www.neu.edu.cn", NULL, NULL, SW_SHOWNORMAL);
ShellExecute()函数在HKEY_CLASSES_ROOT\http\shell\open\command
下进行搜索。默认浏览器在注冊表HKEY_CLASSES_ROOT\.htm
键下的Default设置。
怎样激活相关程序,发送EMAIL?
假设将FileName參数设置为mailto:
协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包含Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将依据Windows 9x/NT注冊表中mailto协议处理程序的设置确定启动哪个邮件客户程序。mailto:用户账号@邮件server地址?subject=邮件主题&body=邮件正文;
如:ShellExecute(handle,L"open",L"mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test", NULL,NULL, SW_SHOWNORMAL);
打开新邮件窗体,并自己主动填入收件人地址、邮件主题和邮件正文。若邮件正文包含多行文本,则必须在每行文本之间增加换行转义字符%0a。ShellExecute()函数在HKEY_CLASSES_ROOT\mailto\shell\open\command
下搜索。
怎样打开一个程序?
ShellExecute(NULL,L"open",L"notepad.exe", L"c:\\MyLog.log", NULL, SW_SHOW );1
怎样用系统打印机打印文档?
ShellExecute(NULL,L"print", L"c:\\abc.txt",NULL, NULL, SW_HIDE); 1
怎样用系统查找功能来查找指定文件?
ShellExecute(NULL,L"find",L"d:\\nish", NULL, NULL, SW_SHOW);1
怎样启动一个程序,直到它执行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile =L"c:\\MyProgram.exe";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);123456789101112
或:
PROCSS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess(L"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(NULL,L"The process could not be started",NULL,NULL);12345678910111213
怎样显示文件或目录的属性?
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"properties";
ShExecInfo.lpFile = L"c:\\"; //can be a file as well
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);1234567891011
使用方法
int ret = (int)ShellExecute(NULL, _T("open"), _T("Dbgview.exe"), NULL, NULL, SW_NORMAL);//打开exe if (ret < 32)//检测是否指定成功
MessageBox(_T("ERROR"));
ret = (int)ShellExecute(NULL, _T("open"), _T("help.pdf"), NULL, NULL, SW_NORMAL);//打开指定文件,将调用默认处理的程序打开 if (ret < 32)
MessageBox(_T("ERROR"));
ret = (int)ShellExecute(NULL, _T("open"), _T("https://www.baidu.com"), NULL, NULL, SW_NORMAL);//打开网址 if (ret < 32)
MessageBox(_T("ERROR"));
ret = (int)ShellExecute(NULL, _T("open"), _T("c:\\windows"), NULL, NULL, SW_NORMAL);//打开文件夹 if (ret < 32)
MessageBox(_T("ERROR"));
ret = (int)ShellExecute(NULL, _T("runas"), _T("cmd.exe"), NULL, NULL, SW_NORMAL);//请求管理员权限打开cmd if (ret < 32)
MessageBox(_T("ERROR"));123456789101112131415
实例:
#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <shellapi.h>int main(void)
{
test01();
}int test01()
{
HINSTANCE hNewExe = ShellExecuteA(NULL, "open", "calc.exe", NULL, NULL, SW_SHOW); if ((DWORD)hNewExe <= 32)
{ printf("return value:%d\n", (DWORD)hNewExe);
} else
{ printf("successed!\n");
} printf("GetLastError: %d\n", GetLastError());
system("pause"); return 1;
}
-----------------------------------割--------------------------------------------
怎样打开并显示一个文本文件呢:
ShellExecute(NULL, "open", "explorer.exe", "D:\\1.txt", NULL, SW_SHOWDEFAULT);
希望可以帮到您