如何判断程序当前运行在Windows CE下还是Windows Mobile下?

maky   2009-8-3 15:46 楼主
如题...如何判断程序当前运行在Windows CE下还是Windows Mobile下?
程序是 C# + .NET CF 2.0的

回复评论 (17)

mobile 的版本好应该是5.1,wince 的是5.0,你试试看
点赞  2009-8-3 16:25
wince 6.0的没试过
点赞  2009-8-3 16:31
6.0以前,使用SystemParametersInfo(SPI_GETPLATFORMTYPE...);
6.0开始,使用SystemParametersInfo(SPI_GETPROJECTNAME...)。
点赞  2009-8-3 17:07
http://msdn.microsoft.com/en-us/library/ms229660.aspx
http://www.christec.co.nz/blog/archives/77
点赞  2009-8-3 17:08
public class PlatformDetector
{
    [DllImport("coredll.dll")]
    private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, StringBuilder pvParam, uint fWinIni);

    private static uint SPI_GETPLATFORMTYPE = 257;

    public static Platform GetPlatform()
    {
        Platform plat = Platform.Unknown;
        switch (System.Environment.OSVersion.Platform)
        {
            case PlatformID.Win32NT:
                plat = Platform.Win32NT;
                break;
            case PlatformID.Win32S:
                plat = Platform.Win32S;
                break;
            case PlatformID.Win32Windows:
                plat = Platform.Win32Windows;
                break;
            case PlatformID.WinCE:
                plat = CheckWinCEPlatform();
                break;
        }

        return plat;
    }

    static Platform CheckWinCEPlatform()
    {
        Platform plat = Platform.WindowsCE;
        StringBuilder strbuild = new StringBuilder(200);
        SystemParametersInfo(SPI_GETPLATFORMTYPE, 200, strbuild, 0);
        string str = strbuild.ToString();
        switch (str)
        {
            case "PocketPC":
                plat = Platform.PocketPC;
                break;
            case "SmartPhone":
                // Note that the strbuild parameter from the
                // PInvoke returns "SmartPhone" with an
                // upper case P. The correct casing is
                // "Smartphone" with a lower case p.
                plat = Platform.Smartphone;
                break;
        }
        return plat;
    }
}

public enum Platform
{
    PocketPC, WindowsCE, Smartphone, Win32NT, Win32S, Win32Windows, Unknown
}
点赞  2009-8-3 17:08
引用: 引用 1 楼 ultrapro 的回复:
mobile 的版本好应该是5.1,wince 的是5.0,你试试看


_WIN32_WCE 这个宏对lz也许有用,对照版本号
点赞  2009-8-3 17:21
2楼的方法简单 呵呵, 就是不太稳 呵呵
5楼的方法...我试了...返回的可能是OEM的信息...晕...那就没发判断了...
点赞  2009-8-3 18:23
引用: 引用 7 楼 dfpgb 的回复:
2楼的方法简单 呵呵, 就是不太稳 呵呵
5楼的方法...我试了...返回的可能是OEM的信息...晕...那就没发判断了...

这可能取决于OEM是否返回了正确的信息。或许你的device的OEM厂商没有实现这个功能,或者说实现的不对。
点赞  2009-8-4 09:27
你调用之后得到的什么返回信息?
点赞  2009-8-4 09:27
引用: 引用 9 楼 codewarrior 的回复:
你调用之后得到的什么返回信息?

  1. static Platform CheckWinCEPlatform()
  2.     {
  3.         Platform plat = Platform.WindowsCE;
  4.         StringBuilder strbuild = new StringBuilder(200);
  5.         SystemParametersInfo(SPI_GETPLATFORMTYPE, 200, strbuild, 0);
  6.         string str = strbuild.ToString();
  7.         switch (str)
  8.         {//str返回了手持设备的型号名称:"PT60"
  9.             case "PocketPC":
  10.                 plat = Platform.PocketPC;
  11.                 break;
  12.             case "SmartPhone":
  13.                 // Note that the strbuild parameter from the
  14.                 // PInvoke returns "SmartPhone" with an
  15.                 // upper case P. The correct casing is
  16.                 // "Smartphone" with a lower case p.
  17.                 plat = Platform.Smartphone;
  18.                 break;
  19.         }
  20.         return plat;
  21.     }
点赞  2009-8-4 10:35
试了SPI_GETPROJECTNAME吗?
点赞  2009-8-4 10:50
引用: 引用 11 楼 codewarrior 的回复:
试了SPI_GETPROJECTNAME吗?


  1. 错误        1        当前上下文中不存在名称“SPI_GETPROJECTNAME”


我建立的项目是WINCE5.0的...所以SPI_GETPLATFORMTYPE就定义了?
点赞  2009-8-6 09:44
引用: 引用 11 楼 codewarrior 的回复:
试了SPI_GETPROJECTNAME吗?


晕...我仔细看了看:SPI_GETPROJECTNAME?? 得到项目名字~~~?
点赞  2009-8-6 09:46
引用: 引用 13 楼 dfpgb 的回复:
引用 11 楼 codewarrior 的回复:
试了SPI_GETPROJECTNAME吗?


晕...我仔细看了看:SPI_GETPROJECTNAME?? 得到项目名字~~~?

这是因为windows embeded 6.0中,可以使用CEBase和SmartFon两种基础项目类型。
点赞  2009-8-6 10:07
引用: 引用 14 楼 codewarrior 的回复:
引用 13 楼 dfpgb 的回复:
引用 11 楼 codewarrior 的回复:
试了SPI_GETPROJECTNAME吗?


晕...我仔细看了看:SPI_GETPROJECTNAME?? 得到项目名字~~~?

这是因为windows embeded 6.0中,可以使用CEBase和SmartFon两种基础项目类型。

啊......这个还没用过...
点赞  2009-8-7 10:17
不是6.0可以无视。
点赞  2009-8-7 10:36
晚些结帖
点赞  2009-8-10 09:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复