【问题标题】:How to make a mobile application stay on top?如何让移动应用保持领先?
【发布时间】:2010-10-19 08:34:04
【问题描述】:

我正在为 Windows Mobile 开发一个移动应用程序。我希望系统在启动时默认启动该应用程序,并且用户无法将其最小化。

所以只有这个应用程序可用,所有其他功能都被禁用。

我确信我可以定义一个启动器,它在启动时执行。但是我想到了一些问题:是否可以进行一些内存优化?我的意思是,因为只有一个应用程序可用和使用,也许可以禁用其他一些程序,从而减少使用的内存?

你有这个目的的链接吗?

编辑

感谢您的回答。我阅读了您关于 kiosk 模式的链接,并发现了另一个关于此主题的非常有趣的帖子。

它说,对于 kiosk 模式的应用程序,从长远来看,使用 Windows CE 而不是 Windows mobile 似乎更好,因为前者更容易适应这些需求。

【问题讨论】:

    标签: .net windows-mobile compact-framework


    【解决方案1】:

    以后可能会发布更多有用的东西,但现在我可以告诉你,你想在 Google 上搜索的词是:“kiosk mode”。

    更新 - 有用的东西(希望如此)

    坦率地说,任何信息亭模式或多或少都是一种黑客行为。 Windows Mobile 不是为它设计的,当您遇到越来越多的边缘情况时,您会发现奇怪的差距,但是对于大多数程序而言,以下内容就足够了:


    任务 1 - 覆盖 UI 和任务栏,使其无法访问:

    在您的主窗体上,将 WindowState 设置为 Maximized,将 FormBorderStyle 设置为 None。 在较旧的操作系统上,您可能需要实际禁用任务栏本身并将表单移到其顶部。这是通过 PInvoking 实现的:

    FindWindow 带有参数“HHTaskBar”(这可能取决于平台,HHTaskbar 适用于 Pocket PC 2003)和 String.Empty

    [DllImport("coredll.dll", EntryPoint="FindWindowW", SetLastError=true)]
    private static extern IntPtr FindWindowCE(string lpClassName, string lpWindowName);
    

    使用 FindWindow 中的 IntPtr 和 false 启用窗口

    [DllImport("coredll.dll", SetLastError=true)]
    public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
    

    带有来自 FindWindow 和 0 (SW_HIDE) 的 IntPtr 的 ShowWindow

    [DllImport("coredll.dll")]
    public static extern bool ShowWindow( IntPtr hwnd, int nCmdShow);
    

    任务 2 - 防止硬连线的应用程序键。

    你知道的,按橙色和左键,它会自动打开 Pocket Outlook。 为此,我将在这里打破排名,并推荐我知道的唯一可行的方法,即使用未记录的 Win32 API 调用。这是一个非常稳定的调用,我每天都在运行一系列使用它的项目我只是想在未来的升级中,如果代码被删除,我可能需要修改代码,所以请记住这一点。

    您需要通过 PInvoke 调用设置低级系统范围的键盘挂钩:

    [DllImport("coredll.dll")]
    private static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hMod, uint dwThreadId);
    

    这相当复杂,最好只是指向像 this one 这样的指南来解释理论。基本前提是发现恼人的“特殊键”的keycode,然后通过钩子将其屏蔽(即不要传递)。

    如果您正在研究 CF,我建议您也研究一下 OpenNETCF,因为我相信它内部已经有一个全局 KeyHook。

    正如我之前所说,这并不完美,IIRC 音量控制是不可阻止的,如果您不在注册表中设置各种标志,新无线网络等通知可能会侵入您的信息亭模式(告诉它不要那样做:))。

    不过,这并不费力,对于您的大多数应用来说应该足够了。


    任务 3 - 让您的应用从启动开始运行

    根据设备的不同,这可能会有所不同。如果您想保留托管代码,问题是 NETCF 未预装在某些设备上。在大多数情况下,您可以只编写一个位于 autorun 目录中的非托管引导程序(应该有一个,检查制造商的文档),然后安装 .NETCF、您的应用程序,然后运行您的应用程序。如果您不想弄脏非托管代码,那么大多数硬件制造商都会提供某种脚本系统来设置您认为合适的设备。然而,这些可能会产生不同程度的效果。

    【讨论】:

    • +1 全面覆盖。较小的更正 - 您在更新中说 Windows CE 不是为 kiosk 模式设计的。这是不正确的。 Windows Mobile 不是,但 Windows CE 肯定可以成为一个信息亭 - 事实上它可以锁定到一个应用程序,甚至根本没有 UI。
    【解决方案2】:

    您希望在“Kiosk 模式”下运行您的设备。实际上,Windows Mobile 设备并不打算在 kiosk 模式下运行。如果您可以选择要使用的设备,请选择一个 Windows CE 设备,您可以为其修改映像。 Windows CE 设备确实可以选择在 kiosk 模式下运行。这是最好的解决方案,但是您需要 Platform Builder 和可以下载图像的设备。

    对于 Windows Mobile,您可以“模拟”信息亭模式。这是你需要做的:

    • 在启动时启动您的应用程序。
    • 让您的应用程序全屏显示。任务栏应该是隐藏的。
    • 拦截可以让您远离应用程序的硬件按钮
    • 如果其他程序在启动时运行,请禁用它们。通常程序不会在启动时启动,因此您不必担心这一点。

    这个article 可能是一个起点。我相信实现一个通用的解决方案将是困难的,甚至是不可能的。而是专注于单个设备。

    【讨论】:

      【解决方案3】:

      这是一个 article on CodeProject,它谈到了将设备置于 Kiosk 模式。

      这至少对您来说是一个入门,但请务必注意文章中列出的有关该示例适用于哪些设备的警告!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 2023-03-23
        • 2020-04-19
        • 2023-04-05
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多