views:

391

answers:

1

Hi, I'd like to be able to query some function and give it a processID or processName - It then should return true or false on wether that process is in the foreground or not.

So i.e. the query for Firefox would return true (because right now I'm in FireFox, typing this) and everything else should return false.



Is that even possible for every type of application (.net, java/swing, pure c++/win32-ui)?

  • This question is for Windows only.
+3  A: 

GetForegroundWindow and GetWindowThreadProcessId should let you get this information.

i.e., if you know the pid just check it against a function like this:

bool IsForegroundProcess(DWORD pid)
{
   HWND hwnd = GetForegroundWindow();
   if (hwnd == NULL) return false;

   DWORD foregroundPid;
   if (GetWindowThreadProcessId(hwnd, &pid) == 0) return false;

   return (foregroundPid == pid);

}

This will work for any application that uses the core Win32 library at some level - this'll include Windows Forms, WPF, native Win32 applications, etc. Note this'll only work for applications running on the calling desktop and session - you can't use this to determine if another user's application is in the foreground, for instance.

Michael
Thanks, do you know if this works for DirectX / OpenGL applications?
Jan Gressmann
I think it might . . . D3D apps have a focus window or device window that might work with this here.
Michael
Okay, just tried it out, seems to work well even on DirectX apps.
Jan Gressmann