我正在尝试将Windows 7应用程序上的鼠标输入重定向到其他窗口。 如果我在获得WM_LBUTTONUP时这样做,它可以工作(其中MouseDown和MouseUp是Win api中的SendInput函数):
SetForegroundWindow( other window );
SetCursorPos( somewhere on the window );
MouseDown();
MouseUp();
SetCursorPos( back );
SetForegroundWindow( main window );
但我不想只发布鼠标,我希望能够捕获所有鼠标内容,包括移动和拖动。
所以这是合乎逻辑的事情,但它不起作用:
WM_LBUTTONDOWN:
Do everything like before without MouseUp()
WM_LBUTTONUP:
Do everything like before without MouseDown()
这甚至不适用于常规点击。我无法弄清楚为什么。 有人可以帮忙吗?
答案 0 :(得分:0)
可能值得查看SendMessage / PostMessage P / Invoke调用,并将消息直接发送到其他应用程序的窗口。您需要对参数进行一些翻译,以便鼠标事件的坐标与您在其他应用程序中的要求相关联,但这样做并不是什么大事......
编辑 - >我在之前挖出了一些我已经完成此操作的代码...这是来自一个窗口,它出现在树视图的顶部,并替换了该树视图的默认窗口工具提示。
private IntPtr _translate(IntPtr LParam)
{
// lparam is currently in client co-ordinates, and we need to translate those into client co-ordinates of
// the tree view we're attached to
int x = (int)LParam & 0xffff;
int y = (int)LParam >> 16;
Point screenPoint = this.PointToScreen(new Point(x, y));
Point treeViewClientPoint = _tv.PointToClient(screenPoint);
return (IntPtr)((treeViewClientPoint.Y << 16) | (treeViewClientPoint.X & 0xffff));
}
const int MA_NOACTIVATE = 3;
protected override void WndProc(ref Message m)
{
switch ((WM)m.Msg)
{
case WM.LBUTTONDBLCLK:
case WM.RBUTTONDBLCLK:
case WM.MBUTTONDBLCLK:
case WM.XBUTTONDBLCLK:
{
IntPtr i = _translate(m.LParam);
_hide();
InteropHelper.PostMessage(_tv.Handle, m.Msg, m.WParam, i);
return;
}
case WM.MOUSEACTIVATE:
{
m.Result = new IntPtr(MA_NOACTIVATE);
return;
}
case WM.MOUSEMOVE:
case WM.MOUSEHWHEEL:
case WM.LBUTTONUP:
case WM.RBUTTONUP:
case WM.MBUTTONUP:
case WM.XBUTTONUP:
case WM.LBUTTONDOWN:
case WM.RBUTTONDOWN:
case WM.MBUTTONDOWN:
case WM.XBUTTONDOWN:
{
IntPtr i = _translate(m.LParam);
InteropHelper.PostMessage(_tv.Handle, m.Msg, m.WParam, i);
return;
}
}
base.WndProc(ref m);
}
答案 1 :(得分:0)
鼠标按钮很时髦。当它变得向下然后向上,在某种程度上它们转换为点击(我想在某些时候鼠标被吃掉了,但我可能没有正确地回忆起来。)
它可以是任意数量的东西,但如果其他窗口(或不是)将按钮向下/向上转换为鼠标点击,则可能会使您的代码混乱。
我建议你打印很多调试信息,并试着找出系统正在做什么。