views:

3301

answers:

4

In an application that I am currently working on, a requirement is to bring a window of an external application to the foreground. Making Win32 API calls such as BringWindowToTop and SetForeground window do not work all the time. This is due to some restrictions within Windows XP. What I would like to do instead is send simulate a mouse click the window's button on the taskbar which I am hoping will bring the window to the front. Does anyone know how this is possible?

+1  A: 

It's possible. But it's extremely sketchy. Your application may also break with the next version of Windows, since it's undocumented. What you need to do is find the window handle of the taskbar, then find the window handle of the child window representing the button, then send it a WM_MOUSEDOWN (I think) message.

Here's a bit on finding the window handle of the taskbar:

http://www.codeproject.com/KB/miscctrl/hide_vista_start_orb.aspx

FWIW, the restrictions on BringWindowToTop/SetForeground are there because it's irritating when a window steals focus. That may not matter if you're working on a corporate environment. Just keep it in mind. :)

DannySmurf
+1  A: 

I used this in a program where I needed to simulate clicks and mouse movements;

Global Mouse and Keyboard Library

nmiranda
A: 

To be honest I've never had an issue bringing a window to the foreground on XP/Vista/2003/2000.

You need to make sure you do the following:

  1. Check if IsIconic (minimized)
  2. If #1 results in true then call ShowWindow passing SW_RESTORE
  3. Then call SetForegroundWindow

I've never had problems that I can think of doing it with those steps.

Ryan Farley
+3  A: 

Check out the section "How to steal focus on 2K/XP" at http://www.codeproject.com/KB/dialog/dlgboxtricks.aspx, as this is exactly what you need. I wouldn't go the taskbar route as the taskbar could be hidden or simply not there.

Joel Lucsy