Вы могли бы использовать регулярное выражение. Сначала вам нужно объединить свой список с некоторым разделителем, который не будет встречаться в тексте. вам просто нужно перебрать все результаты и разделить строку с разделителем
for s in results:
print(s.split(delimiter))
Можно назвать GetWindowThreadProcessId, и это возвратит Вас процесс, связанный с окном.
От этого можно назвать OpenProcess, чтобы открыть процесс и получить дескриптор к процессу.
Борьба с той же проблемой в течение часа теперь, также заменили первую букву a? при помощи GetModuleFileNameEx. Finaly предложил это решение с помощью Системы. Диагностика. Класс процесса.
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
void GetProcessPathFromWindowHandle(IntPtr hwnd)
{
uint pid = 0;
Win32.GetWindowThreadProcessId(hwnd, out pid);
Process p = Process.GetProcessById((int)pid);
return p.MainModule.FileName;
}
При работе платформы окон 64 битов Вы, возможно, должны использовать QueryFullProcessImageName вместо этого. Это возвращает путь стиля пользователя, по сравнению с GetProcessImageFileName, который возвращает системный путь стиля, который должен был бы быть преобразован с помощью NtQuerySymbolicLinkObject или ZwQuerySymbolicLinkObject.
Одна гигантская функция в качестве примера - рекомендует разбить в ре применимые биты.
typedef DWORD (__stdcall *PfnQueryFullProcessImageName)(HANDLE hProcess, DWORD dwFlags, LPTSTR lpImageFileName, PDWORD nSize);
typedef DWORD (__stdcall *PfnGetModuleFileNameEx)(HANDLE hProcess, HMODULE hModule, LPTSTR lpImageFileName, DWORD nSize);
std::wstring GetExeName( HWND hWnd ){
// Convert from Window to Process ID
DWORD dwProcessID = 0;
::GetWindowThreadProcessId(hWnd, &dwProcessID);
// Get a handle to the process from the Process ID
HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);
// Get the process name
if (NULL != hProcess) {
TCHAR szEXEName[MAX_PATH*2] = {L'\0'};
DWORD nExeName = sizeof(szEXEName)/sizeof(TCHAR);
// the QueryFullProcessImageNameW does not exist on W2K
HINSTANCE hKernal32dll = LoadLibrary(L"kernel32.dll");
PfnQueryFullProcessImageName pfnQueryFullProcessImageName = NULL;
if(hKernal32dll != NULL) {
pfnQueryFullProcessImageName = (PfnQueryFullProcessImageName)GetProcAddress(hKernal32dll, "QueryFullProcessImageNameW");
if (pfnQueryFullProcessImageName != NULL)
pfnQueryFullProcessImageName(hProcess, 0, szEXEName, &nExeName);
::FreeLibrary(hKernal32dll);
}
// The following was not working from 32 querying of 64 bit processes
// Use as backup for when function above is not available
if( pfnQueryFullProcessImageName == NULL ){
HINSTANCE hPsapidll = LoadLibrary(L"Psapi.dll");
PfnGetModuleFileNameEx pfnGetModuleFileNameEx = (PfnGetModuleFileNameEx)GetProcAddress(hPsapidll, "GetModuleFileNameExW");
if( pfnGetModuleFileNameEx != NULL )
pfnGetModuleFileNameEx(hProcess, NULL, szEXEName, sizeof(szEXEName)/sizeof(TCHAR));
::FreeLibrary(hPsapidll);
}
::CloseHandle(hProcess);
return( szEXEName );
}
return std::wstring();
}
Что точно Вы пытаетесь сделать? Можно получить идентификатор процесса процесс, который создал окно с GetWindowThreadProcessId (), сопровождаемый OpenProcess () для получения дескриптора процесса. Но это кажется очень топорным, и я чувствую, что существует более изящный способ сделать то, что Вы хотите сделать.
попробуйте это чтобы получить имя исполняемого файла:
C #:
string file = System.Windows.Forms.Application.ExecutablePath;
mfg