這件事情檢查64位進程時,雖然不是那麼簡單,因爲這將是如果它是一個64絕對是可以從32位應用程序位編譯的應用程序:
[Flags]
enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
CreateThread = 0x00000002,
VMOperation = 0x00000008,
VMRead = 0x00000010,
VMWrite = 0x00000020,
DupHandle = 0x00000040,
SetInformation = 0x00000200,
QueryInformation = 0x00000400,
Synchronize = 0x00100000,
ReadControl = 0x00020000,
PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
}
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll")]
private static extern bool QueryFullProcessImageName(IntPtr hprocess, int dwFlags, StringBuilder lpExeName, out int size);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hHandle);
private static Process GetProcessByHandle(IntPtr hwnd)
{
try
{
uint processID;
GetWindowThreadProcessId(hwnd, out processID);
return Process.GetProcessById((int)processID);
}
catch { return null; }
}
private static string GetExecutablePathAboveVista(int ProcessId)
{
var buffer = new StringBuilder(1024);
IntPtr hprocess = OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION,
false, ProcessId);
if (hprocess != IntPtr.Zero)
{
try
{
int size = buffer.Capacity;
if (QueryFullProcessImageName(hprocess, 0, buffer, out size))
{
return buffer.ToString();
}
}
finally
{
CloseHandle(hprocess);
}
}
return null;
}
private static string GetWindowPath(IntPtr hwind)
{
try
{
Process currentProcess = GetProcessByHandle(hwind);
if (Environment.OSVersion.Version.Major >= 6)
{
string newMethReturn = GetExecutablePathAboveVista(currentProcess.Id);
if (!string.IsNullOrWhiteSpace(newMethReturn))
return newMethReturn;
}
if (currentProcess != null)
return currentProcess.MainModule.FileName;
else
return null;
}
catch
{ return null; }
}
唔...這行是錯誤的? – Mehrdad 2011-01-22 15:29:16
return proc.MainModule.FileName.ToString(); – Ron 2011-01-22 15:32:22
嘗試以管理員身份運行程序。 – 2011-01-22 15:33:14