【发布时间】:2016-06-09 09:52:42
【问题描述】:
我正在使用CefSharp 库提供的ChromiumWebBrowser 向我的C# 应用程序的用户显示一个网站。
我正在尝试添加功能以允许用户使用键盘快捷键“放大/缩小”,即CTRL +/CTRL -。
我已设法使用“低级全局键盘挂钩/接收器”将KeyboardListener 添加到嵌入式浏览器:http://www.dylansweb.com/2014/10/low-level-global-keyboard-hook-sink-in-c-net/
目前,当浏览器“聚焦”并且用户在键盘上按下“+”时,我的应用程序将在浏览器上“放大”。我已经这样做了:
private void _listener_OnKeyPressed(object sender, KeyPressedArgs e)
{
if(e.KeyPressed == Key.Add)
{
zoomInExecuted();
}
}
我真正想要的只是在用户按住“CTRL”键,然后按“+”时允许放大。
我在我的 C# 中编写了以下方法(这是被调用的方法:
private void _listener_OnKeyPressed(object sender, KeyPressedArgs e)
{
Debug.WriteLine("e: " + e.KeyPressed.ToString());
if(e.KeyPressed == Key.LeftCtrl)
{
leftCtrlDown = true;
Debug.WriteLine("LeftCtrl pressed, leftCtrlDown should be true: ", leftCtrlDown.ToString());
}
else
{
leftCtrlDown = false;
}
if(e.KeyPressed == Key.RightCtrl)
{
rightCtrlDown = true;
Debug.WriteLine("RightCtrl pressed, rightCtrlDown should be true: ", rightCtrlDown.ToString());
}
else
{
rightCtrlDown = false;
}
if((leftCtrlDown == true)) //&& (e.KeyPressed == Key.Add))
{
if (e.KeyPressed == Key.Add)
{
Debug.WriteLine("Ctrl & + pressed, 'zoomInExecuted()' should be called ");
zoomInExecuted();
}
}else if((rightCtrlDown == true)) //&& (e.KeyPressed == Key.Add))
{
if (e.KeyPressed == Key.Add)
{
Debug.WriteLine("rightCtrl & + pressed, 'zoomInExecuted()' should be called ");
zoomInExecuted();
}
}
}
我使用<Grid> 上的<KeyBinding> 标记调用此方法,其中浏览器显示在我的XAML 中:
<KeyBinding Modifiers="Ctrl" Key="LeftCtrl" Command="{Binding _listener_OnKeyPressed}"></KeyBinding>
但我遇到的问题是:虽然应用程序检测到何时按下“CTRL”键(调试被写入控制台),但似乎无法检测到第二次按下键(“+”键)。
我尝试添加第二个侦听器,它在第一个侦听器内调用,仅当 leftCtrlDown 或 rightCtrlDown 布尔值为真时(即当用户按下任一 CTRL 键时),但应用程序仍然没有'似乎没有检测到第二个键的按下...
如何让我的应用“监听”另一个键的按下,同时它已经确认当前正在按下一个键?
编辑
我已经尝试按照答案中的建议进行操作,现在我的 XAML 中有:
<Window x:Class="..."
....
xmlns:local="clr-namespace:Agent"
... >
<Window.Resources>
...
</Window.Resources>
<Grid Name="grid">
...
<Grid x:Name="grdBrowserHost" MinHeight="900" Height="Auto" MinWidth="1205" Width="Auto" Margin="5,0,0,0" DockPanel.Dock="Bottom" Grid.ColumnSpan="1" >
<Grid.InputBindings>
<KeyBinding Modifiers="Ctrl" Key="Add" Command="{Binding _listener_OnKeyPressed}"></KeyBinding>
</Grid.InputBindings>
...
<cefSharp:ChromiumWebBrowser Name="browser" ...>
<KeyBinding Modifiers="Ctrl" Key="Add">
<KeyBinding.Command>
<local:Zoom Executed="zoomInExecuted" />
</KeyBinding.Command>
</KeyBinding>
</cefSharp:ChromiumWebBrowser.InputBindings>
</Grid>
</Grid>
...
</Window>
我添加的Zoom.cs类如下:
namespace Agent
{
class Zoom : ICommand
{
public event EventHandler<object> Executed;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
if (Executed != null)
Executed(this, parameter);
}
public event EventHandler CanExecuteChanged;
}
}
但由于某种原因,我在 XAML 中遇到了编译错误:
<local:Zoom Executed="zoomInExecuted" />
上面写着:
命名空间“clr-namespace:Agent”中不存在名称“Zoom”。
虽然很明显。
【问题讨论】:
-
LeftCtrl也是修饰符,不能使用 Ctrl + LeftCtrl 的快捷方式 -
您是指在 XAML 中吗?我尝试将其更改为:
<KeyBinding Modifiers="Ctrl" Key="Add" Command="{Binding _listener_OnKeyPressed}"></KeyBinding>但我遇到了同样的问题...我的控制台显示当我按下它时按下了 CTRL,然后显示当我按下它时按下了 +,但是 zoomInExecuted() 函数没有'似乎没有被调用.. -
Zoom 可能需要公开。
标签: c# wpf xaml keyboard-shortcuts keypress