2

x86としてコンパイルされたac#アプリケーションがあるので、Windows7x64で32ビットアプリケーションとして実行されます。アプリケーションの実行中に、アクティブなウィンドウの実行可能ファイル名を検出する必要があります。Winodws XPでは、次のコードが正常に機能しました(アクティブなウィンドウハンドルからプロセスファイル名を取得します)。x64では、32ビットプロセスの名前のみが報告されます(返されたデータをチェックしていないため、他のプロセスのガベージが返されます)。GetForegroundWindowAPIで取得したアクティブウィンドウのハンドルを渡します。

public static string GetProcessPathFromWindowHandle(IntPtr hWnd) {

        string filename = string.Empty;
        uint pid=0;
        Unmanaged.GetWindowThreadProcessId(hWnd, out pid);

        //error in Win64: returns strange characters for Win64 files
        const int nChars = 1024;
        StringBuilder filenameBuffer = new StringBuilder(nChars);
        IntPtr hProcess = Unmanaged.OpenProcess(1040, 0, pid);
        Unmanaged.GetModuleFileNameEx(hProcess, IntPtr.Zero, filenameBuffer, nChars);
        Unmanaged.CloseHandle(hProcess);

        filename = filenameBuffer.ToString();

        //Get the name of the Windows
        int length = Unmanaged.GetWindowTextLength(hWnd);
        StringBuilder sb = new StringBuilder(length + 1);
        Unmanaged.GetWindowText(hWnd, sb, sb.Capacity);

        Logger.Main.LogMessage("Window Title is: " + sb);
        Logger.Main.LogMessage("Process filename is: " + filename);
        return filename;
    }

その情報を64ビット環境で32ビットプロセスから取得できますか?ありがとう。アンドレア

4

2 に答える 2

1

参考までに、1 回の呼び出しで必要なすべてを行う API GetWindowModuleFileNameがあります。ただし、シナリオでうまく機能するかどうかは確認していません。

于 2009-11-03T15:27:23.123 に答える
1

エラー チェックがないため、コードをステップ実行して、さまざまな API 呼び出しがGetModuleFileNameEx適切な情報を返すことを確認しましたか? また、1040アクセス指定子をハードコーディングする代わりに、いくつかの記号定数を定義する必要があります。

使ってみましたSystem.Diagnostics.Process.GetProcessById()か?をMainModule取得できるプロパティがありますFileName。しかし、一見の価値があります。

ただし、大雑把にグーグルで調べてみると、x64 と WoW64 の壁に頭を悩ませている可能性があります。これらのより有用な検索結果の 1つがこれでした- 要約: QueryFullProcessImageNameをチェックしてください。

編集:

どうやら、WMI は WoW64 のギャップを埋めることができるので、SELECT ExecutablePath FROM Win32_Process WHERE ProcessID = %ProcessID%. 私の経験では、WMI はやや重いので、最後の手段です。

于 2010-09-22T08:35:41.463 に答える