Linkinfamous Posted September 8, 2005 Share Posted September 8, 2005 Is there any way to list running 'Applications', as opposed to processes? For example, the contents of the task manager's applications tab, and the windows taskbar. Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/ Share on other sites More sharing options...
0 Andareed Posted September 8, 2005 Share Posted September 8, 2005 The application tasks pane is most likely generated by enumerating through all top level windows (via EnumWindows) and including those windows that have the WS_VISIBLE style set (can be retrieved via GetWindowLong). Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586493175 Share on other sites More sharing options...
0 Linkinfamous Posted September 8, 2005 Author Share Posted September 8, 2005 Excellent. Works perfectly. Thanks. Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586493581 Share on other sites More sharing options...
0 cudret Posted September 28, 2005 Share Posted September 28, 2005 i wanna make same .. but i dont know exactly :p Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586589706 Share on other sites More sharing options...
0 neowin_hipster Posted September 28, 2005 Share Posted September 28, 2005 WEll, i believe the terminology in windows is a "job". A "job" contains several processes which in turn contains several threads. Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586592055 Share on other sites More sharing options...
0 Linkinfamous Posted September 28, 2005 Author Share Posted September 28, 2005 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); Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586592243 Share on other sites More sharing options...
0 budidharma Posted October 6, 2005 Share Posted October 6, 2005 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. Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586632734 Share on other sites More sharing options...
0 Laura_whitley99 Posted December 30, 2005 Share Posted December 30, 2005 I think I found some useful information on "forums.devshed.com". Have a quick search in there. My Webpage Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586990846 Share on other sites More sharing options...
0 Burned Posted December 30, 2005 Share Posted December 30, 2005 http://www.sysinternals.com/Utilities/Filemon.html Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-586991684 Share on other sites More sharing options...
0 aby Posted May 28, 2008 Share Posted May 28, 2008 hi, i m stucking up at the same point as budidharma! @MioTheGreat-- Any help on it?? Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-589435943 Share on other sites More sharing options...
0 aby Posted May 29, 2008 Share Posted May 29, 2008 just one problem, how did you invoke "EnumWindowsProc"? Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-589439071 Share on other sites More sharing options...
0 Bi0haZarD Posted May 29, 2008 Share Posted May 29, 2008 aby said: just one problem, how did you invoke "EnumWindowsProc"? Sep 7 2005 -> Dec 30 2005. :blink: Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-589439143 Share on other sites More sharing options...
0 aby Posted June 19, 2008 Share Posted June 19, 2008 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. Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-589495392 Share on other sites More sharing options...
0 Brandon Live Veteran Posted June 22, 2008 Veteran Share Posted June 22, 2008 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). Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-589501896 Share on other sites More sharing options...
0 aby Posted June 30, 2008 Share Posted June 30, 2008 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). Link to comment https://www.neowin.net/forum/topic/369213-c-list-running-applications/#findComment-589520641 Share on other sites More sharing options...
Question
Linkinfamous
Is there any way to list running 'Applications', as opposed to processes? For example, the contents of the task manager's applications tab, and the windows taskbar.
Link to comment
https://www.neowin.net/forum/topic/369213-c-list-running-applications/Share on other sites
14 answers to this question
Recommended Posts