【问题标题】:Disable menu bar in Windows Mobile 6.5在 Windows Mobile 6.5 中禁用菜单栏
【发布时间】:2011-07-25 06:20:21
【问题描述】:

我正在将 .NET 应用程序从 WM5 移植到 WM6.5。除了新的分辨率,我注意到开始菜单和标题栏(标题栏)的不同 UI 行为。我的应用程序需要在用户无法退出应用程序并绕过我们的身份验证的信息亭模式下工作。为此,我在 WM5 上隐藏了开始按钮和关闭按钮。我正在使用以下功能:

SHFullScreen(hWnd, SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON); 

隐藏按钮也适用于 WM6.5,但还有另一个问题。用户可以点击标题栏(菜单栏、标题栏 - 我不确定它的正确名称 - 屏幕顶部的栏)并访问 Windows 任务管理器。见附件截图

我绕过了用户可以点击并进入任务管理器的地方,如下所示:

任何想法如何禁用该交互?设备是摩托罗拉 MC65。运行 Windows Mobile 6.5。

因此,最终答案是下面发布的答案的一部分:

IntPtr tWnd = FindWindow("HHTaskBar", null);
EnableWindow(tWnd, false);

我们只是找到 HHTaskBar 并禁用它。它有一些缺点,但总的来说可以。

【问题讨论】:

    标签: .net windows-mobile titlebar windows-mobile-6.5 kiosk-mode


    【解决方案1】:

    尝试使用 MSDN 上这样描述的 SHFS_HIDETASKBAR 方法 SHFullScreen

    将任务栏放在底部 z 顺序。请注意,游戏或 需要整个应用程序 screen 可以使用这个标志。请确保 您的应用程序大小已满 使用此标志之前的屏幕。 否则,它会看起来好像 该函数什么也没做。

    protected override void OnLoad(EventArgs e)
    {
        ...
    
        SHFullScreen(this.Handle, SHFS_HIDETASKBAR | 
            SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);
    
        base.OnLoad(e);
    }
    
    private const int SHFS_SHOWTASKBAR = 0x0001;
    private const int SHFS_HIDETASKBAR = 0x0002;
    private const int SHFS_SHOWSIPBUTTON = 0x0004;
    private const int SHFS_HIDESIPBUTTON = 0x0008;
    private const int SHFS_SHOWSTARTICON = 0x0010;
    private const int SHFS_HIDESTARTICON = 0x0020;
    
    [DllImport("aygshell")]
    static extern bool SHFullScreen(IntPtr hwnd, int dwState);
    

    【讨论】:

    • 您的表单是否设置为无边框、最顶层、没有控制框和最小化框?
    • 是的。确实如此: this.MaximizeBox = false; this.ControlBox = false; this.MinimizeBox = false; this.TopMost = true; this.FormBorderStyle = FormBorderStyle.None;
    • 查看一些旧代码(在 CE 6 上工作),在调用 SHFullScreen 后,我的 OnLoad 方法底部有一个 BringToFront()。也试试吧。
    • 我也有。这一切都有问题——我需要不断地调用这个函数,而不仅仅是在 OnLoad 中。因为几乎任何点击控件都会恢复以前的条件。不幸的是,它不会对奇怪的标题栏行为做任何事情——我猜这只是微软在 6.5 中添加的新东西......
    • 我确实找到了这个可能有帮助的线程social.msdn.microsoft.com/Forums/en/netfxcompact/thread/…
    【解决方案2】:

    您可以隐藏整个顶部任务栏并最大化您的表单:

    // the following three lines are p/invoked
    IntPtr tWnd = FindWindow("HHTaskBar", null);
    EnableWindow(tWnd, false);
    ShowWindow(tWnd, SW_HIDE);
    
    // maximize your form
    form.Size = new Size(240, 320); // or whatever the device's screen dimensions are
    form.WindowState = FormWindowState.Maximized;
    

    【讨论】:

    • 我试图避免 this 解决方案。因为在这种情况下,我需要注意网络和电池指示灯,并且可能会自己绘制整个标题。而且它需要对现有应用程序进行重大重构。
    • 我实际上认为你的解决方案的一半会让我满意 :) 我做了 FindWindow/EnableWindow 并且效果很好。用户失去对标题栏的所有访问权限 - 这有一些缺点,但仍然可以接受。感谢您指出正确的方向。
    • 啊,这确实对你有用。很高兴能够提供帮助。
    猜你喜欢
    • 2017-01-28
    • 2012-06-25
    • 2012-09-18
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2012-10-02
    • 2011-08-27
    相关资源
    最近更新 更多