Cornel Grobbelaar
Cornel Grobbelaar

Reputation: 49

How do you fool a window into believing it has focus?

I have been trying to send mouse clicks to a WebBrowser control inside of my form using PostMessage(), and I have run into a rather significant issue. What I am trying to achieve is to simulate mouse clicks on this WebBrowser while my form is minimized. Usually PostMessage() would work just fine doing this, but it seems that it only works while my form has focus. This leads me to believe that there is some check going on to see if the particular website I am loading into my WebBrowser control is in focus before it handles mouse events.

This is how I send the clicks with my program:

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
    }

This is what the resetHandle does:

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

I'm not sure if there is a better way of sending mouse events to a background window and I am open to any ideas. What I am really asking though is if it is at all possible to make a window believe it is in focus when it is actually still minimized?

Any help at all would be much appreciated!

Upvotes: 4

Views: 499

Answers (1)

Edward Brey
Edward Brey

Reputation: 41648

Rather than keep the window minimized, keep it normal (restored), but set its X or Y coordinate so that it is positioned off screen.

If you want give the user the illusion of minimizing and restoring it, use HwndSource.AddHook to watch for SC_MINIMIZE. In your HwndSourceHook handler, move the window on or off screen according to the pseudo-minimized state, and set handled to true.

Upvotes: 1

Related Questions