【问题标题】:How do you fool a window into believing it has focus?你如何欺骗一个窗口,让它相信它有焦点?
【发布时间】:2012-12-17 18:42:01
【问题描述】:

我一直在尝试使用 PostMessage() 将鼠标点击发送到表单内的 WebBrowser 控件,但我遇到了一个相当重要的问题。我想要实现的是在我的表单最小化时模拟此 WebBrowser 上的鼠标点击。通常PostMessage() 会很好地做到这一点,但它似乎只在我的表单有焦点时才有效。这让我相信,在处理鼠标事件之前,有一些检查会检查我加载到 WebBrowser 控件中的特定网站是否处于焦点。

这就是我通过程序发送点击的方式:

private void SendClick(Point location)
    {            
        resetHandle = true;
        StringBuilder className = new StringBuilder(100);
        while (className.ToString() != "Internet Explorer_Server") 
        {
            handle = GetWindow(handle, 5); // 5 == child
            GetClassName(handle, className, className.Capacity);
            //MessageBox.Show(className.ToString());
        }
        IntPtr lParam = (IntPtr)((location.Y << 16) | location.X); 
        IntPtr wParam = IntPtr.Zero; 
        const uint downCode = 0x201; 
        const uint upCode = 0x202;
        const uint moveCode = 0x200;
        PostMessage(handle, moveCode, wParam, lParam); //move mouse
        PostMessage(handle, downCode, wParam, lParam); // mousedown
        PostMessage(handle, upCode, wParam, lParam); // mouseup
    }

这就是 resetHandle 的作用:

private void timer3_Tick(object sender, EventArgs e)
    {
        if (resetHandle == true)
        {
            handle = webBrowser1.Handle;
            resetHandle = false;
        }
    }

我不确定是否有更好的方法将鼠标事件发送到背景窗口,我愿意接受任何想法。我真正要问的是,当它实际上仍然被最小化时,是否有可能让一个窗口相信它是焦点?

任何帮助都将不胜感激!

【问题讨论】:

    标签: c# focus mouseevent postmessage


    【解决方案1】:

    与其保持窗口最小化,不如保持它正常(恢复),但设置它的 X 或 Y 坐标,使其位于屏幕外。

    如果您想让用户产生最小化和恢复它的错觉,请使用HwndSource.AddHook 关注SC_MINIMIZE。在您的HwndSourceHook 处理程序中,根据伪最小化状态将窗口移入或移出屏幕,并将handled 设置为true。

    【讨论】:

    • 感谢 Edward 的回复,但我相信窗口实际上需要焦点,而不仅仅是可见。不过,这是一个聪明的主意。
    • 没关系,我按照你的建议玩了一个游戏,它似乎奏效了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2010-10-11
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多