Есть ли способ в коде для определения того, какой процесс или приложение запускает мой процесс или приложение. Любые .net, VB6 или C++ код надрезы бы здоровоОпределите, какой процесс/программа запустит мой процесс/программу
ответ
В .Net,
Assembly.GetEntryAssembly()
возвращает сборку, текущий запущенный процесс сборки был стартовавший с. Но если у вас есть более чем один процесс запущен, я не верю, что есть какой-нибудь способ, чтобы определить, какой из них был первым, чтобы начать ...
, чтобы получить версию сборки входа,
Assembly.GetEntryAssembly().GetName().Version
Попробуйте это:
public class ParentProc {
[DllImport("KERNEL32.dll")] //[DllImport("toolhelp.dll")]
public static extern int CreateToolhelp32Snapshot(uint flags, uint processid);
[DllImport("KERNEL32.DLL")] //[DllImport("toolhelp.dll")]
public static extern int CloseHandle(int handle);
[DllImport("KERNEL32.DLL")] //[DllImport("toolhelp.dll")
public static extern int Process32Next(int handle, ref ProcessEntry32 pe);
[StructLayout(LayoutKind.Sequential)]
public struct ProcessEntry32 {
public uint dwSize;
public uint cntUsage;
public uint th32ProcessID;
public IntPtr th32DefaultHeapID;
public uint th32ModuleID;
public uint cntThreads;
public uint th32ParentProcessID;
public int pcPriClassBase;
public uint dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public string szExeFile;
};
public static Process FindParentProcess() {
int SnapShot = CreateToolhelp32Snapshot(0x00000002, 0); //2 = SNAPSHOT of all procs
try{
ProcessEntry32 pe32 = new ProcessEntry32();
pe32.dwSize = 296;
int procid = System.Diagnostics.Process.GetCurrentProcess().Id;
while(Process32Next(SnapShot, ref pe32) != 0) {
string xname = pe32.szExeFile.ToString();
if(procid==pe32.th32ProcessID) {
return System.Diagnostics.Process.GetProcessById(Convert.ToInt32(pe32.th32ParentProcessID));
}
}
}catch(Exception ex){
throw new Exception(System.Reflection.MethodBase.GetCurrentMethod() + " failed! [Type:"+ex.GetType().ToString()+", Msg:"+ex.Message+"]");
}finally{
CloseHandle(SnapShot);
}
return null;
}
}
Вы можете использовать это в качестве основы Taking a Snapshot and Viewing Processes. И пройти весь путь до корневого процесса!
Джеймс Браун показывает в своей «ProcessTree» фрагмент кода, как это сделать:
http://www.catch22.net/content/snippets
Хотя код очень C-иш это очень чистый и хорошо понимать.
Он в основном обращается к ZwQuerySystemInformation()
, который возвращает структуру SYSTEM_PROCESSES
во втором аргументе. Эта структура содержит информацию о процессе, в т.ч. член под названием InheritiedFromProcessId
, который является идентификатором родительских процессов.
Напомните, что ZwQuerySystemInformation не является частью SDK Windows, это функция NTDLL и может быть изменена или даже удалена из будущих версий Windows [1]. [1]: http://msdn.microsoft.com/en-us/library/ms725506(VS.85).aspx – Vargas
Если производительность здесь не является большой проблемой, вы также можете использовать WMI и, таким образом, оставаться на 100% управляемой (C#/VB.NET), если вам все равно.
Пример (только запросы WMI, фактический C#/VB.NET код опущен):
// First get figure the ID of your parent process
SELECT ParentProcessID FROM Win32_Process WHERE ProcessID = <MYPROCESSID>
// Than use that the get any attribute, e.g. the Name, of it
SELECT Name FROM Win32_Process WHERE ProcessID = <PARENTPROCESSID>
- 1. Определите, какой компилятор построил мой LAPACK
- 2. Определите, какой GameObject коснулся?
- 3. Определите, какой UISwitch прослушивается
- 4. Определите, какой ключ изменить
- 5. Определите, какой идентификатор проекта мой код приложения работает на
- 6. Определите, какой сигнал вызвал EINTR?
- 7. Определите, какой DLL (.tlb) работает
- 8. Определите, какой QPixmapItem был выбран
- 9. Определите, какой файл конфигурации используется
- 10. Определите, какой PHP-скрипт запущен?
- 11. Определите, какой метод вызывается функцией
- 12. Определите, какой метод QuerySetAPI называется
- 13. Определите, какой скрипт закончен последним
- 14. Определите, какой класс называется IntentService
- 15. Определите, какой веб-сервер используется
- 16. Определите, какой MKPinAnnotationView был выбран?
- 17. SocketIO Определите, какой пользователь отключен
- 18. Определите, какой массив длиннее. JavaScript
- 19. Android: Определите, какой процесс запуска вашего приложения?
- 20. Определите, какой источник использовался в ORACLE COALESCE
- 21. Определите, на какой UIButton нажата - UIImageView
- 22. Когда улей запустит MapReduce?
- 23. Определите, какой процесс блокирует буфер обмена
- 24. Определите, какой пользовательский тег HTML нарушает IE8
- 25. Android Multitouch - Определите, какой палец поднят?
- 26. Определите, какой CocoaPod требуется определенная зависимость
- 27. Определите, в какой ветке произошел фиксатор
- 28. Определите, какой IOS работает на устройстве
- 29. Определите, какой домен более часто вводится (WWW)
- 30. Silverlight: Определите, какой элемент управления инициирован drag'n'drop
Google термины я рекомендую (но не пробовал): окна поиска родительского процесса ... моя логика в том, что Linux поддерживает pid этого родителя процессов, поэтому, возможно, окна делают то же самое. –