FORUMS

Finding Windows and their executable filepaths

170 posts
Thanks Meter: 0
 
By ferrex, Senior Member on 24th January 2008, 06:50 AM
Post Reply Email Thread
I've just spent a lot of time looking for ways to tie Windows and process exe files together and I saw a lot of people asking after similar topics.

It was somewhat frustrating because of numerous little difficulties - using CreateToolhelp32Snapshot unpredictably fails, GetProcessById is no good if the process wasn't started with StartInfo, because you can have multiple windows to a process it's hard to identify which is a processes mainwindow.

But I solved my problem, a solution that I haven't seen elsewhere, so I thought I'd share it here. This is my solution to the specific problem of finding a window to match an executable file path....

This is on WM6, using CF2 in C#.

Used as follows (with S2U2 as the example):

Ionwerks.Window w = new Ionwerks.Window(@"\Program Files\S2U2\S2U2.exe");

IntPtr WindowsHandle = w.handle;

Code:
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Ionwerks
{
	delegate int EnumWindowsProc(IntPtr hwnd, IntPtr lParam);

	class Window
	{
		private EnumWindowsProc callbackDelegate;
		private IntPtr callbackDelegatePointer;

		private IntPtr m_handle = IntPtr.Zero;
		private string moduleFileName = "";

		//Construct from path
		public Window(string path)
		{
			moduleFileName = path;
			Enumerate();
		}

		public IntPtr handle
		{
			get
			{
				return m_handle;
			}
		}

		private void Enumerate() {
			callbackDelegate = new EnumWindowsProc(EnumWindowsCallbackProc);
			callbackDelegatePointer = Marshal.GetFunctionPointerForDelegate(callbackDelegate);

			EnumWindows(callbackDelegatePointer, 0);
		}

		[DllImport("coredll.dll", SetLastError = true)]
		private static extern bool EnumWindows(IntPtr lpEnumFunc, uint lParam);

		[DllImport("coredll.dll", EntryPoint = "GetModuleFileNameW", SetLastError = true)]
		private static extern uint GetModuleFileName(IntPtr hModule, [MarshalAs(UnmanagedType.LPWStr)] string lpFileName, uint nSize);

		[DllImport("coredll")]
		private static extern uint GetWindowThreadProcessId(IntPtr hwnd, out int lpdwProcessId);

		[DllImport("coredll.dll")]
		private static extern IntPtr OpenProcess(int flags, bool fInherit, int PID);

		[DllImport("coredll.dll")]
		private static extern bool CloseHandle(IntPtr handle);

		[DllImport("coredll.dll")]
		private static extern bool IsWindowVisible(IntPtr handle);

		private string ModuleFileName = new string((char)0x20, 255);

		private int EnumWindowsCallbackProc(IntPtr hwnd, IntPtr lParam)
		{
			//get windows process
			int pid = 0;
			GetWindowThreadProcessId(hwnd, out pid);
			IntPtr pHnd = OpenProcess(0, false, pid);

			//get processes image
			GetModuleFileName(pHnd, ModuleFileName, (uint)ModuleFileName.Length);

			//if paths match up
			if (String.Compare(ModuleFileName.Substring(0, ModuleFileName.IndexOf('\0')), moduleFileName, true) == 0)			{
				//only interested in processes mainwindow
				if (hwnd == Process.GetProcessById(pid).MainWindowHandle)
				{
					m_handle = hwnd;
				}
			}
			CloseHandle(pHnd);
			return 1;
		}
	}
}
30th April 2011, 04:29 PM |#2  
Nullstring's Avatar
Retired Recognized Developer
Flag Baguio
Thanks Meter: 245
 
Donate to Me
More
thanks man! your code helped!
17th May 2011, 08:40 AM |#3  
dody's Avatar
Senior Member
Flag Alexandria,Egypt
Thanks Meter: 12
 
More
simple explanation ... ?.... what that codes for and how to use
Post Reply Subscribe to Thread

Guest Quick Reply (no urls or BBcode)
Message:
Previous Thread Next Thread
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes