- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试提高 WPF 业务应用程序的响应能力,以便当用户在等待服务器响应后出现新屏幕的“之间”屏幕时,他们仍然可以输入数据。我可以对事件进行排队(在后台面板上使用 PreviewKeyDown 事件处理程序),但是我很难在加载后将我出列的事件扔回新面板。特别是新面板上的 TextBoxes 没有拾取文本。我尝试过引发相同的事件(在捕获它们时将 Handled 设置为 true,再次引发它们时将 Handled 设置为 false)创建新的 KeyDown 事件、新的 PreviewKeyDown 事件、执行 ProcessInput、在面板上执行 RaiseEvent、将焦点设置在右侧TextBox 和在 TextBox 上做 RaiseEvent,很多东西。
看起来应该很简单,但我无法弄清楚。
以下是我尝试过的一些方法。考虑一个名为 EventQ 的 KeyEventArgs 队列:
这是行不通的一件事:
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
kea.Handled = false;
this.RaiseEvent(kea);
}
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
var key = kea.Key; // Key to send
var routedEvent = Keyboard.PreviewKeyDownEvent; // Event to send
KeyEventArgs keanew = new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(this),
0,
key) { RoutedEvent = routedEvent, Handled = false };
InputManager.Current.ProcessInput(keanew);
}
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
var key = kea.Key; // Key to send
var routedEvent = Keyboard.PreviewKeyDownEvent; // Event to send
this.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(this),
0,
key) { RoutedEvent = routedEvent, Handled = false }
);
}
最佳答案
当我进行一些研究时,我发现了相同的资源,因此我认为您在答案中所做的工作非常有效。
我查看并找到了另一种方法,使用 Win32 API。我不得不引入一些线程和小延迟,因为出于某种原因,关键事件没有以正确的顺序重播。总的来说,我认为这个解决方案更容易,而且我还想出了如何包含修饰键(通过使用 Get/SetKeyboardState 函数)。大写字母有效,键盘快捷键也应如此。
启动演示应用程序,按下键 1 space 2 space 3 tab 4 space 5 space 6
,然后单击该按钮会产生以下结果:
Xml:
<UserControl x:Class="WpfApplication1.KeyEventQueueDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" >
<StackPanel>
<TextBox x:Name="tbOne" Margin="5,2" />
<TextBox x:Name="tbTwo" Margin="5,2" />
<Button x:Name="btn" Content="Replay key events" Margin="5,2" />
</StackPanel>
</UserControl>
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interop;
namespace WpfApplication1
{
/// <summary>
/// Structure that defines key input with modifier keys
/// </summary>
public struct KeyAndState
{
public int Key;
public byte[] KeyboardState;
public KeyAndState(int key, byte[] state)
{
Key = key;
KeyboardState = state;
}
}
/// <summary>
/// Demo to illustrate storing keyboard input and playing it back at a later stage
/// </summary>
public partial class KeyEventQueueDemo : UserControl
{
private const int WM_KEYDOWN = 0x0100;
[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
[DllImport("user32.dll")]
static extern bool GetKeyboardState(byte[] lpKeyState);
[DllImport("user32.dll")]
static extern bool SetKeyboardState(byte[] lpKeyState);
private IntPtr _handle;
private bool _isMonitoring = true;
private Queue<KeyAndState> _eventQ = new Queue<KeyAndState>();
public KeyEventQueueDemo()
{
InitializeComponent();
this.Focusable = true;
this.Loaded += KeyEventQueueDemo_Loaded;
this.PreviewKeyDown += KeyEventQueueDemo_PreviewKeyDown;
this.btn.Click += (s, e) => ReplayKeyEvents();
}
void KeyEventQueueDemo_Loaded(object sender, RoutedEventArgs e)
{
this.Focus(); // necessary to detect previewkeydown event
SetFocusable(false); // for demo purpose only, so controls do not get focus at tab key
// getting window handle
HwndSource source = (HwndSource)HwndSource.FromVisual(this);
_handle = source.Handle;
}
/// <summary>
/// Get key and keyboard state (modifier keys), store them in a queue
/// </summary>
void KeyEventQueueDemo_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (_isMonitoring)
{
int key = KeyInterop.VirtualKeyFromKey(e.Key);
byte[] state = new byte[256];
GetKeyboardState(state);
_eventQ.Enqueue(new KeyAndState(key, state));
}
}
/// <summary>
/// Replay key events from queue
/// </summary>
private void ReplayKeyEvents()
{
_isMonitoring = false; // no longer add to queue
SetFocusable(true); // allow controls to take focus now (demo purpose only)
MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); // set focus to first control
// thread the dequeueing, because the sequence of inputs is not preserved
// unless a small delay between them is introduced. Normally the effect this
// produces should be very acceptable for an UI.
Task.Run(() =>
{
while (_eventQ.Count > 0)
{
KeyAndState keyAndState = _eventQ.Dequeue();
Application.Current.Dispatcher.BeginInvoke((Action)(() =>
{
SetKeyboardState(keyAndState.KeyboardState); // set stored keyboard state
PostMessage(_handle, WM_KEYDOWN, keyAndState.Key, 0);
}));
System.Threading.Thread.Sleep(5); // might need adjustment
}
});
}
/// <summary>
/// Prevent controls from getting focus and taking the input until requested
/// </summary>
private void SetFocusable(bool isFocusable)
{
tbOne.Focusable = isFocusable;
tbTwo.Focusable = isFocusable;
btn.Focusable = isFocusable;
}
}
}
关于WPF 入队和重放关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16076681/
我已经运行 nagios 大约两年了,但最近这个问题开始出现在我的一项服务中。 我越来越 CRITICAL - Socket timeout after 10 seconds 对于 check_htt
我用 CSS 做到了这一点: 但我希望我的客户更改图像框架。在我的图像中,当前帧只是一种颜色 (#000)。但框架可以是装饰性的。因此,客户应使用装饰图像进行取景。我看过 W3Schools' bor
我编写了一个脚本来检查对象中是否有任何缺失的字段,然后返回具有缺失字段的项目的 ID。 它正在返回: [ '222', '333' ] 我期望返回: ['333'] 为什么它也返回222 id? fu
我正在读 Ramakrishnan 的书数据库管理系统,在模式细化和范式相关的章节中,我看到一句话说: K is a candidate key for R means that K ----> R
我正在编写一个 Java 应用程序,以在一夜之间自动化在线游戏中的角色 Action (特别是,它在《最终幻想 XI》中捕鱼)。该应用程序大量使用 java 的 Robot 类来模拟用户键盘输入和检测
我有这个 react 代码,我在某些输入组件上使用 new Date().getTime() 作为 react 键 Prop 。这可能是一种反模式,因为键需要稳定。但我想了解为什么这如此有问题。为什么
我正在尝试将我的简单查询优化为更复杂的查询。 我有三个表 Table 1 a_id info 1 talk 2 talk 3 sleep 4 sit Table 2
Google PageSpeed 审核建议将首屏内容的关键 CSS 添加到 中的标签,并将其余部分推迟到内容加载完成之后。 虽然我不同意这种做法,但正确的实现方式是什么? 我对使用它有一些保留意见
我已经使用 Pika 将 Websocket 集成到 Tornado 和 RabbitMQ 中。它成功地在各种队列上运行直到一段时间。然后引发以下错误: 严重:pika.connection:关闭时尝
我在本地使用 Gulp 和 SASS 进行开发,为动态站点(即 CMS 驱动)编译 CSS。我正在尝试配置一个解决方案来编译全局与关键路径 CSS。到目前为止最好的想法是将我的主要 scss 文件拆分
关于为 gtkmm 运行以下 simple.cc 示例 #include int main(int argc, char * argv[]){ Glib::RefPtr app = Gt
我正在生成一个 TSX 元素列表: this.productsModel = this.state.products.map(o => ( 但是,react 警告我:
我正在使用 Addy Osmani 的“Critical” https://github.com/addyosmani/critical 下面的 package.json 工作正常,但构建仅复制关键
我有一个 Multimap multimap = ArrayListMultimap.create(); 来自 Guava 。我想知道如何对多图中的 Date 键进行排序。 目前,我正在这样做:
我有一个基于 Jekyll 的网站,我想尽快完成它。我的目标是构建 Jekyll 站点、生成关键 CSS 并缩小 HTML 的 gulp 任务。 我的 gulpfile 的一部分看起来像这样: gul
考虑以下串行函数。当我并行化我的代码时,每个线程都会从并行区域(未显示)内调用此函数。我正在努力使这个线程安全和高效(快速)。 float get_stored_value__or__calculat
我正尝试在 tensorflow 中为我自己的自定义类别重新训练 Inception v3 模型。我已经下载了一些数据并将其格式化为目录。当我运行时,python 脚本为图像创建了瓶颈,然后当它运行时
我该如何追查此错误消息的根本原因? (test:1090): GStreamer-CRITICAL **: gst_debug_log_valist: assertion `category != N
我想为要托管在 Pivotal CloudFoundry 上的 Spring Boot 应用程序强制执行 HTTPS,我想现在大多数应用程序都需要这样做。据我所知,常用的方法是使用 http.requ
在 Travis CI 上运行 Pytest 时,我收到 Key -Error。请在下面找到我的程序: import sys import os sys.path.append(os.path.dir
我是一名优秀的程序员,十分优秀!