Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中使用sendmessage将击键发送到窗口仅在我的预览超过源窗口时有效_C#_.net_Windows_Sendmessage - Fatal编程技术网

在C#中使用sendmessage将击键发送到窗口仅在我的预览超过源窗口时有效

在C#中使用sendmessage将击键发送到窗口仅在我的预览超过源窗口时有效,c#,.net,windows,sendmessage,C#,.net,Windows,Sendmessage,我正在创建一个“模拟”缩略图,使用wndproc和sendmessage将任何输入发送到正在预览的窗口。当我发送到的应用程序显示在预览下方时,它可以正常工作,但当发送到未显示的应用程序时,它不起作用 我的绳子看起来不错,我想不是那样的 当我发送到的窗口显示在同一个显示器上,但不处于活动状态(隐藏)时,它工作正常 我用多个程序测试了它,结果是一样的 更新:经过进一步测试,监视器没有问题。它仅在预览位于源窗口上方时有效(即使在其他窗口之间)。认为这是我没有经历过的事情。另一个有趣的是,当在预览部分按

我正在创建一个“模拟”缩略图,使用wndproc和sendmessage将任何输入发送到正在预览的窗口。当我发送到的应用程序显示在预览下方时,它可以正常工作,但当发送到未显示的应用程序时,它不起作用

我的绳子看起来不错,我想不是那样的

当我发送到的窗口显示在同一个显示器上,但不处于活动状态(隐藏)时,它工作正常

我用多个程序测试了它,结果是一样的

更新:经过进一步测试,监视器没有问题。它仅在预览位于源窗口上方时有效(即使在其他窗口之间)。认为这是我没有经历过的事情。另一个有趣的是,当在预览部分按住鼠标时,我不能移动到不起作用的部分;我猜它认为这是窗户的尽头

更新2:使用Spy++,消息在工作和不工作时完全相同

代码:

[SecurityPermissionAttribute(SecurityAction.LinkDemand,Flags=SecurityPermissionFlag.UnmanagedCode)]
受保护的覆盖无效WndProc(参考消息m)
{
如果(m.Msg==0x0204 | | m.Msg==0x0205 | | m.Msg==0x0204 | | m.Msg==0x0020 | | m.Msg==0x02A3)
{
m、 结果=新的IntPtr(windowmanagerActiveMethods.SendMessage(this._windowPtr,(uint)m.Msg,(int)m.WParam,(int)m.LParam));
}else如果(mouseMsgsWithCoords.Contains(m.Msg)){//mouse messegas,我需要在其中更改坐标
IntPtr xy=m.LParam;
双x=未选中((短)(长)xy);
双y=未选中((短)((长)xy>>16));
如果(m.Msg==0x0084 | | m.Msg==0x020E | | m.Msg==0x020A)
{
x-=此.Location.x;
y-=此.Location.y;
}
x*=((双精度)(this.\u sourceWindowRext.Right-this.\u sourceWindowRext.Left)/(双精度)this.Size.Width);
y*=((双精度)(this.\u eveWindowRext.Bottom-this.\u sourceWindowRext.Top)/(双精度)this.Size.Height);

uint lParam=(((uint)(ushort)y使用Microsoft UIA自动化其他应用程序(即使它们在其他显示器上)要比处理鼠标坐标和通过本机方法发送消息容易得多。我查看了一下,它看起来不像我想要的那样。我不知道底层窗口(我要发送到的窗口)这将使我能够识别单击的元素。这是我在查看和查看microsoft页面时理解的。我希望执行类似的操作。microsoft有一些工具(很像Spy++)这样,你就可以窥视有问题的应用程序,并向你展示一个窗口层次结构,以找到你想要的元素,或者你可以根据Codeproject示例使用搜索条件。就是这样,我不想与特定的元素交互,我想将用户的操作转移到源窗口,无论他们在哪里单击。因此,我必须查看源窗口,找出他们将单击的元素,在源中找到该元素,然后发送事件afaik。此外,源窗口的布局将取决于用户。是的,大多数情况下。我希望将其与web浏览器和/或mumble(voip)一起使用同样。使用Microsoft UIA自动化其他应用程序(即使它们在其他显示器上)比处理鼠标坐标和通过本机方法发送消息要容易得多。我查看了一下,它看起来不像是我想要的那样。我不知道底层窗口(我要发送到的窗口)这将使我能够识别单击的元素。这是我在查看和查看microsoft页面时理解的。我希望执行类似的操作。microsoft有一些工具(很像Spy++)这样,你就可以窥视有问题的应用程序,并向你展示一个窗口层次结构,以找到你想要的元素,或者你可以根据Codeproject示例使用搜索条件。就是这样,我不想与特定的元素交互,我想将用户的操作转移到源窗口,无论他们在哪里单击。因此,我必须查看源窗口,找出他们单击的元素,在源中找到该元素,然后发送事件afaik。此外,源窗口的布局将取决于用户。是的,大多数情况下。我希望将其与web浏览器和/或mumble(voip)一起使用。
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0204 || m.Msg == 0x0205 || m.Msg == 0x02004 || m.Msg == 0x0020 || m.Msg == 0x02A3)
        {
            m.Result = new IntPtr(WindowManagerNativeMethods.SendMessage(this._windowPtr, (uint)m.Msg, (int)m.WParam, (int)m.LParam));

        } else if (mouseMsgsWithCoords.Contains(m.Msg)) {  // mouse messegas where I need to chage the coords

            IntPtr xy = m.LParam;
            double x = unchecked((short)(long)xy);
            double y = unchecked((short)((long)xy >> 16));

            if (m.Msg == 0x0084 || m.Msg == 0x020E || m.Msg == 0x020A)
            {

                x -= this.Location.X;
                y -= this.Location.Y;

            }

            x *= ((double)(this._sourceWindowRext.Right - this._sourceWindowRext.Left) / (double)this.Size.Width);
            y *= ((double)(this._eveWindowRext.Bottom - this._sourceWindowRext.Top) / (double)this.Size.Height);

            uint lParam = (((uint)(ushort)y << 16) | (uint)(ushort)x);

            m.Result = new IntPtr(WindowManagerNativeMethods.SendMessage(this._windowPtr, (uint) m.Msg, (int)m.WParam, (int)lParam));



        } else
        {
            base.WndProc(ref m);
        }