Después de probar varios enfoques, incluyendo las de aquí, así como el uso de UIAutomation Events y ETW for WPF, he decidido en una simple unión de un manejador de eventos de WPF. Esto me permite no solo capturar los datos del evento, sino también el UIElement que tiene la atención de los usuarios, por lo que es mucho más fácil rastrear la acción e intención del usuario. Sin esto, necesitaría capturar una imagen visual de la pantalla y hacer una determinación visual de lo que está sucediendo.
He aquí una muestra:
private Int32 _eventCount;
public MainWindow()
{
InitializeComponent();
EventManager.RegisterClassHandler(typeof(UIElement), MouseEnterEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseLeaveEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseMoveEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseUpEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseDownEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), KeyUpEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), KeyDownEvent, (RoutedEventHandler)handleEvent, true);
}
private void handleEvent(object sender, RoutedEventArgs e)
{
var uiElement = e.Source as UIElement;
if (uiElement == null)
{
return;
}
EventStatusDisplay.Text = e.Source + " " + e.RoutedEvent.Name;
EventCountDisplay.Text = (++_eventCount).ToString();
var over = Mouse.DirectlyOver as UIElement;
MouseIsOverDisplay.Text = over == null ? "" : over.ToString();
}
Si bien no se muestra aquí, una vez que consiga el UIElement
puedo realizar el registro e incluso puede entonces utilizar el UIElement.DataContext
para determinar el estado del modelo de vista que está llevando a la vista de forma podemos encontrar patrones de uso durante ciertos flujos de trabajo y estados de datos, así como estados visuales. A continuación, podemos obtener informes sobre esto, así como diferenciar y comparar nuestros mapas de calor por rutas a través del flujo de trabajo y valores de datos.
Gracias Giorgi: es un proyecto interesante, pero realmente es más sesgado para usar la entrada exacta que quiero capturar. La forma en que captura la entrada es un poco intrusiva (un UIElement personalizado y un conjunto de propiedades adjuntas). Prefiero encontrar algo que no tenga que modificar código para usar. – codekaizen