2017-09-09 5 views
-4

GetForegroundWindow関数からハンドルを取得できます。そして、BaseName ハンドルを取得したいと思います。だから、私はGetModelBaseName関数を使用しました。しかし、私はこの機能が正しく動作していないと思います。GetForegroundWindow関数を使用してModuleBaseNameを取得する方法は?

TCHAR TitleName[MAX_PATH] = TEXT(""); 
HANDLE hFirst = GetForegroundWindow(); 
GetModuleBaseName(hFirst, NULL, TitleName, MAX_PATH); 
_tprintf(TEXT("%s \n"), TitleName); 

教えてください。問題は何ですか?

+0

現在のプロセスのパスを取得しようとしていますか?はいの場合は間違っています。 – Asesh

+2

GetModuleBaseName()にはプロセスハンドルが必要です。 GetWindowProcessThreadId()を使用して、ウィンドウハンドルをプロセスIDにマップします。次にOpenProcess()を呼び出してプロセスハンドルを取得します。あなたはそのような周りにスヌープするのに十分な権利を持っていなければなりません、標高が必要かもしれません。 –

+0

ありがとうございました。はい、現在のプロセスのパスを取得しようとしています。あなたが言ったその方法を試しました。しかし、GetCurrentProcess関数はコンソールシステムで他のアプリケーションを取得できないと思います。例。主な機能を実行して、私はクロムのような他のアプリケーションを実行しました。この場合、GetCurrentProcessはchromeを取得できません。この問題を解決するためのアイデアはありますか?私に教えてください。 – comingkim

答えて

1

あなたは間違っているので、それはfalseを返すため、GetLastErrorはERROR_INVALID_HANDLE(6)を返します。

HWND WINAPI GetForegroundWindow(void); 

は、現在のフォアグラウンドウィンドウを返し、型HWNDのそれのウィンドウハンドルを返します。

あなたはあなたのアプリケーションのファイル名を取得するために、これを行うことができます。加えて

TCHAR szName[MAX_PATH]; 
GetModuleBaseName(GetCurrentProcess(), GetModuleHandle(NULL), szName, MAX_PATH); 

を、また、あなたのアプリケーションのフルパスを取得するために、GetModuleFileNameはやGetMappedFileNameを使用することができます編集

は彼が望んでいますあまりにも何かをする。別のプロセスのパスを取得するには、そのプロセスをプロセスIDでオープンする必要があります。たとえば、9912がChromeのプロセスIDであれば、次のコードを実行してパスを取得できます

HANDLE process = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, 9912); 
if (process) 
{ 
    char file_path[MAX_PATH]; 
    if (::GetModuleFileNameEx(process, nullptr, file_path, MAX_PATH)) 
    { 
     std::cout << file_path << std::endl; 
    } 
    else 
    { 
     std::cout << "Error retrieving path" << std::endl; 
    } 

    ::CloseHandle(process); 
} 
+2

代わりに 'GetProcessImageFileName()'や 'QueryFullProcessImageName()'を使うと、 'PROCESS_QUERY_INFORMATION'の代わりに' PROCESS_QUERY_LIMITED_INFORMATION'を使ってプロセスを開くことができます –

関連する問題