• 0

[C#] List running Applications


Question

14 answers to this question

Recommended Posts

  • 0

Ack! My old thread! It lives again?

For anyone interested, here's how I ended up doing it.

private const int GWL_EXSTYLE = (-20);
        private const int WS_EX_TOOLWINDOW = 0x80;
        private const int WS_EX_APPWINDOW = 0x40000;
        private const int GW_OWNER = 4;
        public delegate int EnumWindowsProcDelegate(int hWnd, int lParam);
        [DllImport("user32")]
        private static extern int EnumWindows(Pop.EnumWindowsProcDelegate lpEnumFunc, int lParam);
        [DllImport("User32.Dll")]
        public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount);
        [DllImport("user32", EntryPoint = "GetWindowLongA")]
        private static extern int GetWindowLongPtr(int hwnd, int nIndex);
        [DllImport("user32")]
        private static extern int GetParent(int hwnd);
        [DllImport("user32")]
        private static extern int GetWindow(int hwnd, int wCmd);
        [DllImport("user32")]
        private static extern int IsWindowVisible(int hwnd);
        [DllImport("user32")]
        private static extern int GetDesktopWindow();

        private static bool IsTaskbarWindow(int hWnd)
        {
            int lExStyle;
            int hParent;
            lExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
            hParent = GetParent(hWnd);
            bool fTaskbarWindow = ((IsWindowVisible(hWnd) != 0) & (GetWindow(hWnd, GW_OWNER) == 0) & (hParent == 0 | hParent == GetDesktopWindow()));
            if ((lExStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW)
            {
                fTaskbarWindow = false;
            }
            if ((lExStyle & WS_EX_APPWINDOW) == WS_EX_APPWINDOW)
            {
                fTaskbarWindow = true;
            }
            return fTaskbarWindow;
        }
        public static int EnumWindowsProc(int hWnd, int lParam)
        {
            if (IsTaskbarWindow(hWnd))
            {
                StringBuilder sb = new StringBuilder(1024);
                GetWindowText(hWnd, sb, sb.Capacity);
                String xMsg = sb.ToString();
                {
                    if (xMsg.Length > 0)
                    {
                        //Do whatever.
                    }
                }
            }
            return 1;
        }

Call it like so:

EnumWindows(EnumWindowsProc, 0);

  • 0
  Dayon said:
Ack! My old thread! It lives again?

For anyone interested, here's how I ended up doing it.

private const int GWL_EXSTYLE = (-20);
        private const int WS_EX_TOOLWINDOW = 0x80;
        private const int WS_EX_APPWINDOW = 0x40000;
        private const int GW_OWNER = 4;
        public delegate int EnumWindowsProcDelegate(int hWnd, int lParam);
        [DllImport("user32")]
        private static extern int EnumWindows(Pop.EnumWindowsProcDelegate lpEnumFunc, int lParam);
        [DllImport("User32.Dll")]
        public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount);
        [DllImport("user32", EntryPoint = "GetWindowLongA")]
        private static extern int GetWindowLongPtr(int hwnd, int nIndex);
        [DllImport("user32")]
        private static extern int GetParent(int hwnd);
        [DllImport("user32")]
        private static extern int GetWindow(int hwnd, int wCmd);
        [DllImport("user32")]
        private static extern int IsWindowVisible(int hwnd);
        [DllImport("user32")]
        private static extern int GetDesktopWindow();

        private static bool IsTaskbarWindow(int hWnd)
        {
            int lExStyle;
            int hParent;
            lExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
            hParent = GetParent(hWnd);
            bool fTaskbarWindow = ((IsWindowVisible(hWnd) != 0) & (GetWindow(hWnd, GW_OWNER) == 0) & (hParent == 0 | hParent == GetDesktopWindow()));
            if ((lExStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW)
            {
                fTaskbarWindow = false;
            }
            if ((lExStyle & WS_EX_APPWINDOW) == WS_EX_APPWINDOW)
            {
                fTaskbarWindow = true;
            }
            return fTaskbarWindow;
        }
        public static int EnumWindowsProc(int hWnd, int lParam)
        {
            if (IsTaskbarWindow(hWnd))
            {
                StringBuilder sb = new StringBuilder(1024);
                GetWindowText(hWnd, sb, sb.Capacity);
                String xMsg = sb.ToString();
                {
                    if (xMsg.Length > 0)
                    {
                        //Do whatever.
                    }
                }
            }
            return 1;
        }

Call it like so:

EnumWindows(EnumWindowsProc, 0);

586592243[/snapback]

This looks great. But I'm confused about how exactly to use it.

I've got a form set up, and added another class to it: WindowScraper - which has the following code:

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace WindowScraper
{
	/// <summary>
	/// Summary description for WindowScraper.
	/// </summary>
	public class WindowScraper
	{
  public WindowScraper()
  {
  	//
  	// TODO: Add constructor logic here
  	//
  }

  /// <summary>
  /// Imported user32 functions.
  /// </summary>

  private const int GWL_EXSTYLE = (-20);
  private const int WS_EX_TOOLWINDOW = 0x80;
  private const int WS_EX_APPWINDOW = 0x40000;
  private const int GW_OWNER = 4;

  public delegate int EnumWindowsProcDelegate(int hWnd, int lParam);

  [DllImport("user32")]
  private static extern int EnumWindows(EnumWindowsProcDelegate lpEnumFunc, int lParam);

  [DllImport("User32.Dll")]
  public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount);

  [DllImport("user32", EntryPoint = "GetWindowLongA")]
  private static extern int GetWindowLongPtr(int hwnd, int nIndex);

  [DllImport("user32")]
  private static extern int GetParent(int hwnd);

  [DllImport("user32")]
  private static extern int GetWindow(int hwnd, int wCmd);

  [DllImport("user32")]
  private static extern int IsWindowVisible(int hwnd);

  [DllImport("user32")]
  private static extern int GetDesktopWindow();

  /// <summary>
  /// Functions
  /// </summary>

  private static bool IsTaskbarWindow(int hWnd)
  {
  	int lExStyle;
  	int hParent;
  	lExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
  	hParent = GetParent(hWnd);
  	bool fTaskbarWindow = ((IsWindowVisible(hWnd) != 0) & (GetWindow(hWnd, GW_OWNER) == 0) & (hParent == 0 | hParent == GetDesktopWindow()));
  	if ((lExStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW)
  	{
    fTaskbarWindow = false;
  	}
  	if ((lExStyle & WS_EX_APPWINDOW) == WS_EX_APPWINDOW)
  	{
    fTaskbarWindow = true;
  	}
  	return fTaskbarWindow;
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="hWnd"></param>
  /// <param name="lParam"></param>
  /// <returns></returns>

  public static int EnumWindowsProc(int hWnd, int lParam)
  {
  	if (IsTaskbarWindow(hWnd))
  	{
    StringBuilder sb = new StringBuilder(1024);
    GetWindowText(hWnd, sb, sb.Capacity);
    String xMsg = sb.ToString();
  	{
    if (xMsg.Length > 0)
    {
    	//Do whatever.
    }
  	}
  	}
  	return 1;
  }

	}
}

Now, In my form, I want to do the following: Create a function which Clears the listbox and adds an item for each found window (text). I know manipulate the listbox, obviously, but I don't know how to return a list of the window names.

I also want to return a list of the window handles, so that I can create bitmap's of them to save.

Any idea how to do this?

Thanks.

Oh, and one more thing, In the original code, this:

        [DllImport("user32")]
        private static extern int EnumWindows(Pop.EnumWindowsProcDelegate lpEnumFunc, int lParam);

Will not compile because pop is not a valid namespace. I deleted "pop." and it compiled fine, though i don't know if that will affect it working.

  • 0
  Bi0haZarD said:
Sep 7 2005 -> Dec 30 2005.

:blink:

lols.. :D

that was a stupid question !! I admit ! now dont gimme scary looks..

i was an open source guy thrown in this .net stuff by organization, so got stuck up that time.. lols

well for rest, it worked for me too, if anyone need help, post.

  • 0
  aby said:
just one problem, how did you invoke "EnumWindowsProc"?

You don't. The window manager does. EnumWindowsProc is a callback function. You define the function, pass a function pointer (delegate) in the EnumWindows call, and then EnumWindows will call you back by calling that function once for every window in its list.

  Goalie_CA said:
WEll, i believe the terminology in windows is a "job". A "job" contains several processes which in turn contains several threads.

That is not correct. Well, it is correct that Windows has a concept called "job" that groups processes together. But it has nothing to do with what shows up in the Applications tab of Task Manager.

That list uses a similar mechanism to what the taskbar uses. It enumerates top-level windows and decides whether to display each one based on specific properties (WS_EX_APPWINDOW, etc).

  • 0

hey thanks Brandon,

but I've already found the solution. yes the same way I did.

  Brandon Live said:
You don't. The window manager does. EnumWindowsProc is a callback function. You define the function, pass a function pointer (delegate) in the EnumWindows call, and then EnumWindows will call you back by calling that function once for every window in its list.

That is not correct. Well, it is correct that Windows has a concept called "job" that groups processes together. But it has nothing to do with what shows up in the Applications tab of Task Manager.

That list uses a similar mechanism to what the taskbar uses. It enumerates top-level windows and decides whether to display each one based on specific properties (WS_EX_APPWINDOW, etc).

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Sayan Sen, do you think one day an image of the Windows Vista desktop or the wallpaper could be used in the primary image of an article?
    • Big fan of EAC Here's a good non-default naming scheme I found on the web (can't take credit) File Name Scheme - %albumartist%\%year% - %albumtitle%\%tracknr2% %title% Various Artists Naming Scheme - Various Artists\%year% - %albumtitle%\%tracknr2% %title%
    • Hello, Probably the simplest way of doing this would be to add a video card to your computer.   Regards, Aryeh Goretsky  
    • Check out Lisa Melton's GitHub transcoding scripts https://github.com/lisamelton/video_transcoding
    • ChatGPT's Advanced Voice Mode gets a significant update to make it sound more natural by Pradeep Viswanathan OpenAI introduced Advanced Voice Mode last year alongside the launch of GPT-4o. This feature uses natively multimodal models, such as GPT-4o, and can respond to audio inputs in as little as 232 milliseconds, with an average of 320 milliseconds, similar to human response time in a typical conversation. It can also generate audio that feels more natural, pick up on non-verbal cues, such as the speed you’re talking, and respond with emotion. Early this year, OpenAI released a minor update to Advanced Voice Mode that reduced interruptions and improved accents. Today, OpenAI has launched a significant upgrade to Advanced Voice Mode, making it sound even more natural and human-like. Responses now feature subtler intonation, realistic cadence—including pauses and emphasis—and more accurate expressiveness for certain emotions such as empathy and sarcasm. This update also introduces support for translation. ChatGPT users can now use Advanced Voice Mode to translate between languages. Simply ask ChatGPT to start translating, and it will continue translating throughout the conversation until instructed to stop. This feature effectively replaces the need for dedicated voice translation apps. For now, the updated Advanced Voice Mode is available only to ChatGPT paid users. OpenAI also noted that there are some known limitations with this latest update, outlined below. This update may occasionally result in minor reductions in audio quality, such as unexpected variations in tone and pitch—especially noticeable with certain voice options. OpenAI expects to improve audio consistency over time. Rare hallucinations in Voice Mode still persist, sometimes producing unintended sounds resembling ads, gibberish, or background music. While some minor limitations remain, the steady stream of improvements points to a future where the line between human and AI conversation becomes increasingly indistinguishable.
  • Recent Achievements

    • Week One Done
      maimutza earned a badge
      Week One Done
    • Week One Done
      abortretryfail earned a badge
      Week One Done
    • First Post
      Mr bot earned a badge
      First Post
    • First Post
      Bkl211 earned a badge
      First Post
    • One Year In
      Mido gaber earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      486
    2. 2
      +FloatingFatMan
      264
    3. 3
      snowy owl
      242
    4. 4
      ATLien_0
      223
    5. 5
      Edouard
      191
  • Tell a friend

    Love Neowin? Tell a friend!