Windows Mobile 5 - 如何杀死其他应用程序?

时间:2009-10-21 07:11:24

标签: c# windows-mobile compact-framework

目前,我正在为 Windows Mobile 5.0 创建2个应用程序(应用A和B)并使用 Compact Framework 2.0 。 App A是主应用程序,B是子应用程序。

  • 以下是流程:
    1. 启动应用程序A.
    2. App A将启动应用程序B.
    3. App B会做一些处理。
    4. App B会杀死app A.
    5. App B将修补/升级应用程序A.(ala更新管理员)
    6. App B将重新启动应用程序A.
    7. App B将退出。

现在我被困在杀死app A.我确实尝试过使用 OpenNETCF ProcessEntry Kill()功能。当调用Kill()时,它使设备崩溃。

我尝试使用 SendMessage(hWnd,WM_CLOSE,0,0)功能,其中WM_CLOSE将具有ProcessEntry.ProcessID值,而我没有为hWnd变量赋值。但它没有终止应用程序A.我是否分配了错误的值?

我也尝试过使用

Process.GetProcessById(processEntry.ProcessID).CloseMainWindow()

,但因为GetProcessById只接受int32值而失败。请注意,processEntry.ProcessID值大于int32值,Compact Framework不支持GetProcessByName()。

你可以帮我通过应用B杀死应用A吗? 感谢。

5 个答案:

答案 0 :(得分:1)

您可以使用TerminateProcess功能尝试本机代码:

processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
success = TerminateProcess(processHandle, 0);

以上代码来自Code Project的任务管理器。

但是,如果您正在编写这两个应用程序的代码,那么如果您在两个应用程序之间设计通信机制会更好。通过这种方式,您将从应用B向应用A发送消息,应用A将自行终止。

答案 1 :(得分:1)

Stormenet ,我硬编码了应用程序的名称。然后我生成一个对象,使用 OpenNETCF.ToolHelp.ProcessEntry [] = ProcessEntry.GetProcesses();

获取所有可用的进程

然后在foreach循环中,如果ProcessEntry对象例如: processEntry.ExeFile 与“applicationName”匹配,我将使用 processEntry.Kill()。

我认为您可以从OpenNETCF网站获取 OpenNETCF.ToolHelp dll

答案 2 :(得分:0)

请注意,如果您尝试杀死的应用程序持有开放端口或其他系统资源,那么它可能会在退出时挂起。当表单关闭时,确保一切都得到有效处理。

这可以通过将内容放入:

来实现
public void Dispose(bool disposing)
{
}

主表单设计器中的代码块,或者如果您选择了较少的Windows Form中心体系结构,那么只需在Application.Run(new YourForm())之后运行您的dispose调用,它将在应用程序具有之后执行闭合。

如果你感觉很懒,那么只需设置一些析构函数(也称为终结器〜),但是如果你这样做的话,请注意在“destruct”时间浏览托管对象之间的关系,因为无法保证哪个订单对象将被销毁。

答案 3 :(得分:0)

ctacke ,我认为应用程序A崩溃是由于某些正在运行的线程未正确关闭或仍在后台运行,因为应用程序A将在应用程序B执行Kill()函数期间运行多个线程

如果我使用SendMessage(hWnd,WM_CLOSE,0,0)函数,它不会使设备崩溃(这是一件好事)......它只会关闭表单。 (app A包含多种形式,例如:frmLogin和frmMainMenu)。嗯,也许我需要将hWnd指向正确的形式...

答案 4 :(得分:0)

现在我采取了不同的路线。

下载补丁并将其放入临时文件夹后,我将使用 OpenNETCF.WindowsCE.PowerManagement.SoftReset()进行软重置。

App B将在启动时启动,然后它将扫描临时文件夹并用新版本替换app A.