locked
WM 中后台程序恢复的问题! RRS feed

  • 问题

  •  

    想请教各位,在我运行一个程序的时候如何判断此程序是否已经在后台运行,

     

    如果已经在后台运行,则恢复程序,(避免多开!!)

     

    否则则新开一个程序

    2008年8月15日 2:35

答案

  •  bobcy 写:

    据我测试,WM操作系统并没有它宣称的那么牛X,一个程序确保只会运行一个实例。不管是用native code还是托管代码开发的WM应用程序,如果指望让系统来自己管理,不停的CreateProcess同一个程序的话,肯定会出现一个程序的多个运行实例。

     

    最稳妥的办法还是自己动手,如果你写的程序有窗口的话,在程序创建窗口前用FindWindow找该程序的主窗口,如果找到的话,将找到的窗口放到前台,然后退出。如果没有窗口的话,用Mutex来判断你的程序是否已经运行。

     

    如果你的程序是纯本地代码编写(without CLR),那么跟在WinCE下无异,你需要在你的程序检查当前的运行的程序(方法很多,比如CreateEvent捕获异常或者使用FindWindow找MailWindow等等,这里不做详细介绍)

    如果你的程序是托管的(with CLR Supports),那么你设备上的.NET Compact Framework CLR会帮你做这个维护,保证你的应用程序不会出现多份。CLR此时的工作如下模式:

    首先,CLR会找到你的程序入口点,在尝试加载你的应用程序之前它会检查程序集的信息,看要加载的应用程序是否在当前已请求Singleton的程序清单上,如果没有则证明是首次执行程序,然后再加载该应用程序到CLR中,然后请求Singleton保护。

    简单说来如下所示:

    AppStart();

    CheckSingletonMutex();

    LoadAppIntoCLR();

    AcquireSingletonMutex();

    但是,当你启动的间隔极短,在Check Singleton还没完成的时候,还是有可能出现多个你的应用程序实例同时存在的情况。例如Bobcy说的使用程序创建应用程序的实例,所以,作为正式的产品,这样的检查还是有必要的。

     

    黄季冬

    http://fox23.cnblogs.com

     

     

    2008年8月17日 2:45
    版主

全部回复

  • Windows Mobile系统一搬都有保持只有一个版本的应用运行的功能. 当然, 在程序中也可以判断,可以参考以下视频:

    http://msdn.microsoft.com/en-us/netframework/bb943002.aspx

     

    Best Regards,

     

    黄季冬

    http://fox23.cnblogs.com

     

     

    2008年8月15日 12:23
    版主
  • 据我测试,WM操作系统并没有它宣称的那么牛X,一个程序确保只会运行一个实例。不管是用native code还是托管代码开发的WM应用程序,如果指望让系统来自己管理,不停的CreateProcess同一个程序的话,肯定会出现一个程序的多个运行实例。

     

    最稳妥的办法还是自己动手,如果你写的程序有窗口的话,在程序创建窗口前用FindWindow找该程序的主窗口,如果找到的话,将找到的窗口放到前台,然后退出。如果没有窗口的话,用Mutex来判断你的程序是否已经运行。

    2008年8月16日 4:04
  •  bobcy 写:

    据我测试,WM操作系统并没有它宣称的那么牛X,一个程序确保只会运行一个实例。不管是用native code还是托管代码开发的WM应用程序,如果指望让系统来自己管理,不停的CreateProcess同一个程序的话,肯定会出现一个程序的多个运行实例。

     

    最稳妥的办法还是自己动手,如果你写的程序有窗口的话,在程序创建窗口前用FindWindow找该程序的主窗口,如果找到的话,将找到的窗口放到前台,然后退出。如果没有窗口的话,用Mutex来判断你的程序是否已经运行。

     

    如果你的程序是纯本地代码编写(without CLR),那么跟在WinCE下无异,你需要在你的程序检查当前的运行的程序(方法很多,比如CreateEvent捕获异常或者使用FindWindow找MailWindow等等,这里不做详细介绍)

    如果你的程序是托管的(with CLR Supports),那么你设备上的.NET Compact Framework CLR会帮你做这个维护,保证你的应用程序不会出现多份。CLR此时的工作如下模式:

    首先,CLR会找到你的程序入口点,在尝试加载你的应用程序之前它会检查程序集的信息,看要加载的应用程序是否在当前已请求Singleton的程序清单上,如果没有则证明是首次执行程序,然后再加载该应用程序到CLR中,然后请求Singleton保护。

    简单说来如下所示:

    AppStart();

    CheckSingletonMutex();

    LoadAppIntoCLR();

    AcquireSingletonMutex();

    但是,当你启动的间隔极短,在Check Singleton还没完成的时候,还是有可能出现多个你的应用程序实例同时存在的情况。例如Bobcy说的使用程序创建应用程序的实例,所以,作为正式的产品,这样的检查还是有必要的。

     

    黄季冬

    http://fox23.cnblogs.com

     

     

    2008年8月17日 2:45
    版主