2017-02-03 21 views
1

让我先解释一下我目前的情况以及为什么我认为我需要这个。很可能是我正在以完全错误的方式处理这个问题,因此欢迎提出建议。在c#winforms中,如何获取激活窗口并转发它的事件

我们有一个使用winforms的c#程序,只有一个嵌入式的System.Windows.Forms.WebBrowser,它显示了一个嵌入java applet的网站。 我们的用户一次可以打开其中几个程序。 Java applet有时需要一些时间来计算数据,而用户同时只使用他的其他窗口之一。当java小应用程序完成时,它将焦点设置为自身,并且整个窗口弹出顶部,从而中断用户正在做的其他任务。我们无法访问java小程序源,也无法以任何方式对其进行修改。调用通过COM连接到WebBrowser的java脚本函数具有相同的效果。

为了解决这个问题,我们在整个表单上创建了“停用”事件。被调用时,它会设置嵌入的WebBrowser.Enabled = false。在相应的事件“激活”Web浏览器再次启用。 这很好用:windows不会弹出,因为java小程序想要在后台设置焦点。

现在我们遇到的问题是,当用户点击停用的窗口时,窗口被激活,但鼠标点击不会被转发到WebBrowser。例如,用户必须点击两次才能按下按钮。

所以我想我的问题是如何转发鼠标点击激活窗口到WebBrowser。

在此先感谢 马库斯

+0

当我找到你时,可以在Form_Activated事件中调用WebBrowser.Select():https://msdn.microsoft.com/en-us/library/system.windows.forms。 form.activated(v = vs.110).aspx – RomCoo

+0

听起来很棘手。也许更容易通过承载Web浏览器的窗体中的WndProc覆盖来抑制导致窗口焦点的来自Java的窗口消息。 (@RomCoo他们试图转发实际的点击事件,而不仅仅是激活,就像当你打开两个浏览器相邻时,你可以在后台打开一个链接,只需点击一下) – dlatikay

+0

@dlatikay谢谢你的建议。我只是试了一下,在整个窗口覆盖了WndProc,并查看了它获取的消息,它们总是按照WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED的顺序。之后,我得到了几个不同的消息,它们总是以不同的顺序出现:WM_ACTIVATEAPP WM_GETICON,WM_NCACTIVE,WM_ACTIVATE。我认为这是相当不确定的,因为我需要知道这些消息的来源: - / – Charon

回答

0

我想我找到了解决办法。它的工作原理,但我不喜欢它:

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo); 

    private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
    private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 

    protected override void WndProc(ref Message m) 
    { 
     // If the panel which contains the WebBrowser was diabled, the messages WM_LBUTTONDOWN and WM_RBUTTONDOWN will not reach the panel 
     // but will reach the window instead. We then resend them. 
     if(m.Msg == 0x0201) // WM_LBUTTONDOWN 
     { 
      short x, y; 
      MouseCoordsFromMessage(m, out x, out y); 

      mouse_event(MOUSEEVENTF_LEFTDOWN, (uint)x, (uint)y, 0, 0); 
     } 
     else if(m.Msg == 0x0204) // WM_RBUTTONDOWN 
     { 
      short x, y; 
      MouseCoordsFromMessage(m, out x, out y); 

      mouse_event(MOUSEEVENTF_RIGHTDOWN, (uint)x, (uint)y, 0, 0); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 

    private static void MouseCoordsFromMessage(Message m, out short x, out short y) 
    { 
     x = unchecked((short)(long)m.LParam); 
     y = unchecked((short)((long)m.LParam >> 16)); 
    } 

我不知道是多么的脆弱,这是和想听听其他人的意见。