Как делают меня GetModuleFileName (), если у меня только есть дескриптор окна (hWnd)?

Вы могли бы использовать регулярное выражение. Сначала вам нужно объединить свой список с некоторым разделителем, который не будет встречаться в тексте. вам просто нужно перебрать все результаты и разделить строку с разделителем

for s in results:
    print(s.split(delimiter))
10
задан Daniel DiPaolo 22 July 2011 в 14:34
поделиться

5 ответов

Можно назвать GetWindowThreadProcessId, и это возвратит Вас процесс, связанный с окном.

От этого можно назвать OpenProcess, чтобы открыть процесс и получить дескриптор к процессу.

6
ответ дан 3 December 2019 в 21:24
поделиться

Борьба с той же проблемой в течение часа теперь, также заменили первую букву 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;
}
8
ответ дан 3 December 2019 в 21:24
поделиться

При работе платформы окон 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();
}
2
ответ дан 3 December 2019 в 21:24
поделиться

Что точно Вы пытаетесь сделать? Можно получить идентификатор процесса процесс, который создал окно с GetWindowThreadProcessId (), сопровождаемый OpenProcess () для получения дескриптора процесса. Но это кажется очень топорным, и я чувствую, что существует более изящный способ сделать то, что Вы хотите сделать.

1
ответ дан 3 December 2019 в 21:24
поделиться

попробуйте это чтобы получить имя исполняемого файла:

C #:

string file = System.Windows.Forms.Application.ExecutablePath;

mfg

0
ответ дан 3 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: