如何捕获鼠标“后退”按钮并使其执行其他操作?

时间:2017-01-13 14:49:36

标签: c# xaml windows-8.1-universal

我正在使用Windows 8.1通用应用程序,并且所有页面都在“根”Frame对象的“内部”。

着陆页是主页,用户可以从5个不同的页面中进行选择。当用户转到其中一个页面时,该页面上有一个“主页”按钮,可以将它们带回主页。

我最近发现,如果鼠标上有一个后退按钮,它将返回到访问的最后一页。这种返回主页的方法绕过了应用程序所需的一些逻辑。

是否可以“禁用”鼠标上前进和后退按钮的任何操作?如果不可能,我可以捕获该事件并将其重定向到具有必要逻辑的方法吗?

谢谢,
扎克

3 个答案:

答案 0 :(得分:0)

我认为您正在寻找导航服务的概念。

MSDN Article应该可以帮助您管理向后导航。

答案 1 :(得分:0)

VK_XBUTTON1和VK_XBUTTON2。 这些是附加鼠标按钮的常量,通常分配给前进和后退导航。

如果您想立即处理X按钮消息,则使用WM_XBUTTONDOWN和WM_XBUTTONUP将它们发布到您的应用程序。

点击此处:https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731.aspx

答案 2 :(得分:0)

编辑:我刚注意到这个问题是关于“通用应用”,这个例子适用于WinForms,但它可能有助于找到Universal或UWP应用的答案......

假设您已经在按钮上有两个事件处理程序,可以向后导航(class MyClass : public SomeLibraryClass { public: MyObject* ptrToSomething; mutable std::set<boost::thread::id> threadsIds; mutable boost::mutex mutex; MyClass(){ ptrToSomething = new MyObject[threadsNumber]; for(int i = 0; i < threadsNumber; ++i){ ptrToSomething[i] = new MyObject(); } } void myFunction() const override{ { boost::thread::id id = boost::this_thread::get_id(); boost::mutex::scoped_lock scoped_lock(mutex); threadsIds.insert(id); std::set<boost::thread::id>::iterator iter = threadsIds.find(id); int index = std::distance(threadsIds.begin(), iter); myTempObject = &ptrToSomething[index]; } // do something } } )和向前导航(void NavigateBack(object sender, EventArgs e)

首先将此代码段添加到您的表单代码中:

void NavigateForward(object sender, EventArgs e)

然后转到设计器视图,浏览表单上的所有主要控件,并将PreviewKeyDown和MouseDown事件连接到相应的方法。

更好(未来证明)的方法是编写代码以递归方式连接事件,如下所示:

private void HandlePreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.XButton1:
            NavigateBack(sender, e); // call the back button event handler
            break;
        case Keys.XButton2:
            NavigateForward(sender, e); // call the forward button event handler
            break;
    }
}

private void HandleMouseDown(object sender, MouseEventArgs e)
{
    switch (e.Button)
    {
        case MouseButtons.XButton1:
            NavigateBack(sender, e); // call the back button event handler
            break;
        case MouseButtons.XButton2:
            NavigateForward(sender, e); // call the forward button event handler
            break;
    }
}

使用private void HookupNavigationButtons(Control ctrl) { for (int t = ctrl.Controls.Count - 1; t >= 0; t--) { Control c = ctrl.Controls[t]; c.PreviewKeyDown -= HandlePreviewKeyDown; c.PreviewKeyDown += HandlePreviewKeyDown; c.MouseDown -= HandleMouseDown; c.MouseDown += HandleMouseDown; HookupNavigationButtons(c); } }

InitializeComponent();之后的某处调用该方法

如果您只想要鼠标事件,可以省略键盘内容,但有一些键盘也有这些导航按钮。