求救!!怎样等待打开的mailto结束????

guqiwei 2010-04-27 08:20:51
我用ShellExceteEx打开的邮件

SHELLEXECUTEINFO ShellInfo = {0};
ShellInfo.lpVerb = _T("open");
ShellInfo.lpFile = _T("mailto:gqwmail@126.com");
ShellInfo.nShow = SW_SHOWMAXIMIZED;
ShellInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShellExecuteEx(&ShellInfo);


可是得到的ShellInfo中的hProcess和hwnd为空,这样的话怎样等待打开的窗口结束呢?
...全文
232 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
guqiwei 2010-04-27
  • 打赏
  • 举报
回复
传参数也是一样的
guqiwei 2010-04-27
  • 打赏
  • 举报
回复
呵呵,谢谢了,再等等,结帖给分。
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
我查了GetLastError(),返回值是0,说明执行成功了。
至于为什么hProcess的值为NULL,这个,没有源码,恐怕是不行了。
你可以再看看MSDN的解释。
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
我是实在找不到原因了,呵呵。
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
那就绕过去。通过注册表得到C:\Program Files\Windows Live\Mail\wlmail.exe,然后通过传递参数,来发送邮件。
或者CreateProcess的方式。
guqiwei 2010-04-27
  • 打赏
  • 举报
回复
可是我们知道 mailto 实际上是根据 注册表中的
[HKEY_CLASSES_ROOT\mailto\shell\open\command]来打开文件的
这个键值并不是个快捷方式呀
例如我的就是:
"C:\Program Files\Windows Live\Mail\wlmail.exe" /mailurl:%1
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
你的图显示不了,我给你编辑了一下内容。
看到了,我在VC和MinGW下都调试过了。
应该是不支持快捷方式的原因。
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
guqiwei 2010-04-27
  • 打赏
  • 举报
回复
guqiwei 2010-04-27
  • 打赏
  • 举报
回复
Loaden请看截图


「已注销」 2010-04-27
  • 打赏
  • 举报
回复
抱歉,没找到原因。
看了MSDN,但没有找到相关mailto的特殊说明。
改成这样也不行:
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE | SEE_MASK_HMONITOR;
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
#include <windows.h>
#include <tchar.h>

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
SHELLEXECUTEINFO sei;
// Æô¶¯½ø³Ì
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_FLAG_NO_UI;
sei.hwnd = NULL;
sei.lpVerb = NULL;
sei.lpFile = _T("mailto:gqwmail@126.com");
sei.lpParameters = NULL;
sei.lpDirectory = NULL;
sei.nShow = SW_SHOWNORMAL;
sei.hInstApp = NULL;
ShellExecuteEx(&sei);
WaitForSingleObject(sei.hProcess, INFINITE);

return 0;
}

我试了,确实不行。找了半天,没找到原因。
guqiwei 2010-04-27
  • 打赏
  • 举报
回复
Loaden,首先谢谢你的解答,不过请你在自己机器上试一下看看,注意一定要是打开MAILTO。打开文件我是没有问题的
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guqiwei 的回复:]

这种方法不行,因为返回的hProcess为空值,mailto比较特殊!!!
[/Quote]
我认为应该是你这个结构体的初始化有问题。
建议参考我给的例子的初始化。
guqiwei 2010-04-27
  • 打赏
  • 举报
回复
这种方法不行,因为返回的hProcess为空值,mailto比较特殊!!!
「已注销」 2010-04-27
  • 打赏
  • 举报
回复
启动进程并等待结束:

方法1, 用ShellExecuteEx函数
SHELLEXECUTEINFO sei;
// 启动进程
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.lpVerb = NULL;
sei.lpFile = "Calc.exe";
sei.lpParameters = "";
sei.lpDirectory = NULL;
sei.nShow = SW_SHOW;
sei.hInstApp = NULL;
ShellExecuteEx(&sei);
// 加入下面这句就是等待该进程结束
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
// 也可以直接关闭这个进程,只要保留sei.hProcess就行
TerminateProcess(sei.hProcess, 0);

方法2, 用CreateProcess函数
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
if(CreateProcess("D:\\Winnt\\Notepad.exe", NULL,
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
else
{
MessageBox(Handle, "无法启动进程!", "Error", MB_OK);
}
另外:
VOID ExitProcess(UINT uExitCode); // exit code for all threads
uExitCode是退出码, 也就是返回值, 返回给操作系统.一般根据返回值判断运行是否成功.

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧