gpt4 book ai didi

.net - 是否有任何工具/库 (.Net/WPF) 可以测量和存储 UI 导航数据以供分析?

转载 作者:行者123 更新时间:2023-12-02 02:45:07 25 4
gpt4 key购买 nike

我想测量和分析 UI 中的用户 Action 和手势,以改善应用程序的用户体验。我曾想象功能跟踪库(如 EQATEC 或 Preemptive 的运行时智能)将允许这样做。然而,事实似乎并非如此。

理想情况下,我希望能够检测 UI,然后捕获鼠标和键盘导航手势以通过热图显示。

我的搜索结果为空。这里有任何 OSS 或商业内容吗?

最佳答案

  1. 下载 Sources Version 2从这里article on code project
  2. 打开解决方案或仅打开 Gma.UserActivityMonitor 项目并盲目将其转换为 .NET 4.0
  3. HookManager.Callbacks.cs 文件中进行以下更改。

    1. 使用 System.Diagnostics 添加
    2. 替换

      s_MouseHookHandle = SetWindowsHookEx(
      WH_MOUSE_LL,
      s_MouseDelegate,
      Marshal.GetHINSTANCE(
      Assembly.GetExecutingAssembly().GetModules()[0]),
      0);

      using (Process curProcess = Process.GetCurrentProcess())
      using (ProcessModule curModule = curProcess.MainModule)
      {
      s_MouseHookHandle = SetWindowsHookEx(
      WH_MOUSE_LL,
      s_MouseDelegate,
      GetModuleHandle(curModule.ModuleName), 0);
      }
    3. 替换

      s_KeyboardHookHandle = SetWindowsHookEx(
      WH_KEYBOARD_LL,
      s_KeyboardDelegate,
      Marshal.GetHINSTANCE(
      Assembly.GetExecutingAssembly().GetModules()[0]),
      0);

      using (Process curProcess = Process.GetCurrentProcess())
      using (ProcessModule curModule = curProcess.MainModule)
      {
      s_KeyboardHookHandle = SetWindowsHookEx(
      WH_KEYBOARD_LL,
      s_KeyboardDelegate,
      GetModuleHandle(curModule.ModuleName), 0);
      }
  4. HookManager.Windows.cs 中的 HookManager 类定义中的任意位置添加以下两行。

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr GetModuleHandle(string lpModuleName);
  5. 现在您应该能够构建它并将其放在一边。现在启动 WPF 部分。

  6. 最好创建名称为 WpfApplication1 的新 WPF 项目。添加对在步骤 1-5 中构建的项目/程序集的引用,添加对 System.Windows.Forms 的引用。
  7. 现在将 MainWindow.xaml 替换为以下 XAML,确保检查类名称和项目名称,我刚刚创建了 WpfApplication1 进行测试。

    <Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
    <Grid.RowDefinitions>
    <RowDefinition Height="0.30*"/>
    <RowDefinition Height="0.70*"/>
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0" Orientation="Horizontal">
    <StackPanel Orientation="Vertical">
    <CheckBox Name="MouseMove" Padding="5" Content="Mouse Move" Width="120" Height="30" Click="checkBoxOnMouseMove_CheckedChanged"/>
    <CheckBox Name="MouseClick" Padding="5" Content="Mouse Click" Width="120" Height="30" Click="checkBoxOnMouseClick_CheckedChanged"/>
    <CheckBox Name="MouseDown" Padding="5" Content="Mouse Down" Width="120" Height="30" Click="checkBoxOnMouseDown_CheckedChanged"/>
    </StackPanel>
    <StackPanel Orientation="Vertical">
    <CheckBox Name="MouseUp" Padding="5" Content="Mouse Up" Width="120" Height="30" Click="checkBoxOnMouseUp_CheckedChanged"/>
    <CheckBox Name="MouseDouble" Padding="5" Content="Mouse Double" Width="120" Height="30" Click="checkBoxMouseDoubleClick_CheckedChanged"/>
    <CheckBox Name="MouseWheel" Padding="5" Content="Mouse Wheel" Width="120" Height="30" Click="checkBoxMouseWheel_CheckedChanged"/>
    </StackPanel>
    <StackPanel Orientation="Vertical">
    <CheckBox Name="KeyDown" Padding="5" Content="Key Down" Width="120" Height="30" Click="checkBoxKeyDown_CheckedChanged"/>
    <CheckBox Name="KeyPress" Padding="5" Content="Key Press" Width="120" Height="30" Click="checkBoxKeyPress_CheckedChanged"/>
    <CheckBox Name="KeyUp" Padding="5" Content="Key Up" Width="120" Height="30" Click="checkBoxKeyUp_CheckedChanged"/>
    </StackPanel>
    <StackPanel Orientation="Vertical">
    <TextBlock Name="labelMousePosition" Text="x={0:####}; y={1:####}"/>
    <TextBlock Name="labelWheel" Text="Wheel={0:####}"/>
    </StackPanel>
    </StackPanel>
    <TextBlock Name="textBoxLog" Text="START" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Visible"/>
    </Grid>
    </Window>
  8. 现在将以下代码添加到 MainWindow 类定义的 MainWindow.xaml.cs 文件中。

    #region Check boxes to set or remove particular event handlers.

    private void checkBoxOnMouseMove_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)MouseMove.IsChecked)
    {
    HookManager.MouseMove += HookManager_MouseMove;
    }
    else
    {
    HookManager.MouseMove -= HookManager_MouseMove;
    }
    }

    private void checkBoxOnMouseClick_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)MouseClick.IsChecked)
    {
    HookManager.MouseClick += HookManager_MouseClick;
    }
    else
    {
    HookManager.MouseClick -= HookManager_MouseClick;
    }
    }

    private void checkBoxOnMouseUp_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)MouseUp.IsChecked)
    {
    HookManager.MouseUp += HookManager_MouseUp;
    }
    else
    {
    HookManager.MouseUp -= HookManager_MouseUp;
    }
    }

    private void checkBoxOnMouseDown_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)MouseDown.IsChecked)
    {
    HookManager.MouseDown += HookManager_MouseDown;
    }
    else
    {
    HookManager.MouseDown -= HookManager_MouseDown;
    }
    }

    private void checkBoxMouseDoubleClick_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)this.MouseDouble.IsChecked)
    {
    HookManager.MouseDoubleClick += HookManager_MouseDoubleClick;
    }
    else
    {
    HookManager.MouseDoubleClick -= HookManager_MouseDoubleClick;
    }
    }

    private void checkBoxMouseWheel_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)MouseWheel.IsChecked)
    {
    HookManager.MouseWheel += HookManager_MouseWheel;
    }
    else
    {
    HookManager.MouseWheel -= HookManager_MouseWheel;
    }
    }

    private void checkBoxKeyDown_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)KeyDown.IsChecked)
    {
    HookManager.KeyDown += HookManager_KeyDown;
    }
    else
    {
    HookManager.KeyDown -= HookManager_KeyDown;
    }
    }


    private void checkBoxKeyUp_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)KeyUp.IsChecked)
    {
    HookManager.KeyUp += HookManager_KeyUp;
    }
    else
    {
    HookManager.KeyUp -= HookManager_KeyUp;
    }
    }

    private void checkBoxKeyPress_CheckedChanged(object sender, EventArgs e)
    {
    if ((bool)KeyPress.IsChecked)
    {
    HookManager.KeyPress += HookManager_KeyPress;
    }
    else
    {
    HookManager.KeyPress -= HookManager_KeyPress;
    }
    }

    #endregion

    //##################################################################
    #region Event handlers of particular events. They will be activated when an appropriate check box is checked.

    private void HookManager_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    textBoxLog.Text += (string.Format("KeyDown - {0}\n", e.KeyCode));

    }

    private void HookManager_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    textBoxLog.Text += (string.Format("KeyUp - {0}\n", e.KeyCode));

    }


    private void HookManager_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
    textBoxLog.Text += (string.Format("KeyPress - {0}\n", e.KeyChar));

    }


    private void HookManager_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    labelMousePosition.Text = string.Format("x={0:0000}; y={1:0000}", e.X, e.Y);
    }

    private void HookManager_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    textBoxLog.Text += (string.Format("MouseClick - {0}\n", e.Button));

    }


    private void HookManager_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    textBoxLog.Text += (string.Format("MouseUp - {0}\n", e.Button));

    }


    private void HookManager_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    textBoxLog.Text += (string.Format("MouseDown - {0}\n", e.Button));

    }


    private void HookManager_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    textBoxLog.Text += (string.Format("MouseDoubleClick - {0}\n", e.Button));

    }


    private void HookManager_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    labelWheel.Text = string.Format("Wheel={0:000}", e.Delta);
    }

    #endregion

9.构建并运行您的WPF应用程序,您可能需要在MainWindow中添加using Gma.UserActivityMonitor;指令。

10.所有功劳都归George Mamaladze 最初构建它的人,您可能想向他发送一封感谢信,如果您想从中赚钱,还请检查原作者的此代码的分发许可证。

11.我刚刚做了一些小的更改以使其能够与 WPF 一起使用。感谢您关注这篇长文章,我不确定如何共享此代码,这就是为什么提供这样的说明。

12.我在 SO 上很好地格式化代码方面非常糟糕,有人可以就如何很好地格式化代码、XML 发表评论吗?还有人帮助我格式化这篇文章中的代码片段。谢谢。

关于.net - 是否有任何工具/库 (.Net/WPF) 可以测量和存储 UI 导航数据以供分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4092793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com