我正在使用由CefSharp库提供的ChromiumWebBrowser向我的C#应用程序用户展示网站。
我正在尝试添加功能,允许用户使用键盘快捷键进行“缩放”,即CTRL + / CTRL -。
我已成功向嵌入式浏览器添加了KeyboardListener,使用“低级全局键盘钩子/接收器”,可在http://www.dylansweb.com/2014/10/low-level-global-keyboard-hook-sink-in-c-net/中找到。
目前,当浏览器处于“焦点”状态时,用户按下键盘上的“+”键,我的应用程序将“放大”浏览器。我是通过以下方式实现的:
但我遇到的问题是:虽然应用程序可以检测到按下“CTRL”键(调试信息写入控制台),但似乎它无法检测第二个键(“+”键)的按下。
我尝试添加了第二个侦听器,在第一个侦听器内调用,仅当
在已经确认有一个键被按下的情况下,如何使我的应用程序“监听”另一个键的按下?
编辑
我已经尝试了答案中建议的方法,并在我的XAML中添加了以下内容:
我正在尝试添加功能,允许用户使用键盘快捷键进行“缩放”,即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();
}
}
}
我正在使用XAML中显示浏览器的<Grid>
标签上的<KeyBinding>
标签来调用此方法:
<KeyBinding Modifiers="Ctrl" Key="LeftCtrl" Command="{Binding _listener_OnKeyPressed}"></KeyBinding>
但我遇到的问题是:虽然应用程序可以检测到按下“CTRL”键(调试信息写入控制台),但似乎它无法检测第二个键(“+”键)的按下。
我尝试添加了第二个侦听器,在第一个侦听器内调用,仅当
leftCtrlDown
或rightCtrlDown
布尔值为true时(即用户按下任一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" />
内容如下:
名称“Zoom”在命名空间“clr-namespace:Agent”中不存在。
尽管它明显存在。
LeftCtrl
也是一个修饰键,你不能为Ctrl + LeftCtrl
设置快捷键。 - Manfred Radlwimmer<KeyBinding Modifiers="Ctrl" Key="Add" Command="{Binding _listener_OnKeyPressed}"></KeyBinding>
,但我仍然遇到了同样的问题...我的控制台显示当我按下CTRL时,CTRL被按下,然后显示当我按下+时,+被按下,但zoomInExecuted()函数似乎没有被调用... - Noble-Surfer