【问题标题】:PostMessage mouse click to background windowPostMessage 鼠标点击到后台窗口
【发布时间】:2016-02-26 15:22:54
【问题描述】:

我已经看到很多关于此定向到 SendInput 的线程,但在这种情况下不起作用。

我正在尝试将鼠标点击发送到背景窗口(游戏)的某个位置。

我可以使用 PostMessage 成功地将鼠标点击发送到背景窗口,但我需要在外部设置鼠标位置才能使其工作。

[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;

PostMessage(hWnd, WM_LBUTTONDOWN, 1, 0);
PostMessage(hWnd, WM_LBUTTONUP, 0, 0);

我也试过用点扩展

public int MakeLParam(int LoWord, int HiWord)
{
    return (int)((HiWord << 16) | (LoWord & 0xFFFF));
}

PostMessage(hWnd, WM_LBUTTONDOWN, 1, MakeLParam(pt.X, pt.Y));

但似乎没有任何效果。 是否可以通过 PostMessage 设置位置,或者我必须在外部设置位置,然后单击,然后将光标设置回原始位置?

感谢任何帮助。

【问题讨论】:

  • 它往往会起作用,但事故很常见。您不(也不能)控制键盘状态,因此程序可能会认为您生成了 Ctrl+Click。当然,您可能会弄错窗口句柄,Process.MainWindowHandle 通常并不正确。使用外观漂亮的 Spy++,总是喜欢 UI 自动化库。

标签: c# .net


【解决方案1】:

pt.X 和 pt.Y 表示 hWnd 中的位置,而不是屏幕中的位置。
因为您的其余代码运行良好。

【讨论】:

  • 不抱歉,这不能解决问题
【解决方案2】:

您需要像这样更改您的位置操作点:

 PostMessage(pl, WM_LBUTTONDOWN, 1,MakeLParam(70,20));
        PostMessage(pl, WM_LBUTTONUP, 0,MakeLParam(71,21));

【讨论】:

  • C# 没有 MakeLParam 有什么想法吗?
  • public static int MakeLParam(int x, int y) =&gt; (y &lt;&lt; 16) | (x &amp; 0xFFFF);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
相关资源
最近更新 更多