微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在鼠标事件后解析剪贴板内容的优雅方式

如何解决在鼠标事件后解析剪贴板内容的优雅方式

我正在尝试找到一种优雅的方法来解析 C# 中鼠标事件后的剪贴板内容

我目前正在 C# WinForm 中为游戏“PathOfExile”创建一个工具,该工具基本上可以执行以下操作:

On mouse down over an item
    if the item contain any desirable mod
        disable the mouse//suppress the mouse click

为此,我使用“mousekeyhook”和“WindowsInput”创建了一个小型 winform 项目,以捕获鼠标/键事件并发送 ctrl+c。

在 PathOfExile 中,当您在光标位于某个项目顶部时发送“Ctrl+C”,该项目的所有属性都会被复制到剪贴板。

我希望不必对工具进行多线程处理,因为该过程应该如下工作:

Mouse down

send ctrl+c

copy the clipboard content

Analyze the clipboard

continue with the mouse events,or suppress the mouse down

在执行上述操作时,我在剪贴板中遇到了一些问题,我没有收到来自最新的“CTRL+C”的信息。看起来我正在接收“以前的”剪贴板信息。另外,当我订阅“OnMouseDownExt”时,我似乎无法再打开 Chrome...但这可能是 mousekeyhook 插件的问题。

这是我的一段代码

private IKeyboardMouseEvents m_Events;

  private WindowsInput.InputSimulator iSim = new InputSimulator();

  private void SubscribeGlobal()
  {
     Unsubscribe();
     Subscribe(Hook.GlobalEvents());
  }

  private void Subscribe(IKeyboardMouseEvents events)
  {
     m_Events = events;
     m_Events.MouseDownExt += OnMouseDownExt;
  }

  private void Unsubscribe()
  {
     if (m_Events == null) return;
     m_Events.MouseDownExt -= OnMouseDownExt;

     m_Events.dispose();
     m_Events = null;
  }


  private void OnMouseDownExt(object sender,MouseEventExtArgs e)
  {

 // Send the CTRL+C 
 iSim.Keyboard.ModifiedKeystroke(VirtualKeyCode.CONTROL,VirtualKeyCode.VK_C);

 string strClipboard = "Clipboard empty";

 for (int i = 0; i < 10; i++)
 {
    try
    {
       if (Clipboard.ContainsText())
       {
          strClipboard = Clipboard.GetText();
          Clipboard.Clear();
          break;
       }
    }
    catch (Exception ex)
    {
       Log(ex.ToString());
       //fix for OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))
       //https://stackoverflow.com/questions/12769264/openclipboard-Failed-when-copy-pasting-data-from-wpf-datagrid
       //https://stackoverflow.com/questions/68666/clipbrd-e-cant-open-error-when-setting-the-clipboard-from-net
       System.Threading.Thread.Sleep(10);
    }

 }


 Log(strClipboard);

  }

  private void Log(string text)
  {
     if (Isdisposed) return;
     textBoxLog.Text = text;

  }

如果您遇到过类似问题,请告诉我。

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。