目前,我正在为 Windows Mobile 5.0 创建2个应用程序(应用A和B)并使用 Compact Framework 2.0 。 App A是主应用程序,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吗? 感谢。
答案 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.