3

C#GetForegroundWindow()は、複数のウィンドウに対して同じ結果を返しますが、EnumWindows実際にはそのウィンドウをまったく返しません。各プロセスには、実際には独自の層があります。

また、両方のGetWindowThreadProcessId()関数を調べて、それらをで列挙しましたGetChildWindows()が、それでも、と同じウィンドウを返しませんGetForegroundWindow()

どのようにして適切に開始しGetForegroundWindow()、適切なものから取得するものに変換しますEnumWindowsか?

目標:GetForegroundWindow+適切に列挙して、適切なトップレベルのハンドル(クロムのすべてのタブ、プロジェクトフォーム)を取得しますが、混乱をふるいにかける必要はありGetAllWindows()ません。ありがとう。

private ArrayList GetAllWindows()
{
    var windowHandles = new ArrayList();
    EnumedWindow callBackPtr = GetWindowHandle;
    EnumWindows(callBackPtr, windowHandles);

    foreach (IntPtr windowHandle in windowHandles.ToArray())
    {
        EnumChildWindows(windowHandle, callBackPtr, windowHandles);
    }

    return windowHandles;
}

private delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumWindows(EnumedWindow lpEnumFunc, ArrayList lParam);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumedWindow callback, ArrayList lParam);

List<IntPtr> ids = new List<IntPtr>();

private bool GetWindowHandle(IntPtr windowHandle, ArrayList windowHandles)
{
    windowHandles.Add(windowHandle);
    listBox1.Items.Add(windowHandle);
    //ids.Add(GetWindowThreadProcessId(windowHandle, IntPtr.Zero));
    return true;
}
4

1 に答える 1

0

Windows で C++ に使用するものは次のとおりです。

TCHAR buf[255];    
HWND foregroundWindow = GetForegroundWindow();
DWORD* processID = new DWORD;
GetWindowText(foregroundWindow, buf, 255);
GetWindowThreadProcessId(foregroundWindow, processID);
DWORD p = *processID;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                              PROCESS_VM_READ,
                              FALSE, p);
TCHAR szProcessName[MAX_PATH];

if (NULL != hProcess )
{
    HMODULE hMod;
    DWORD cbNeeded;

    if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
                             &cbNeeded) )
    {
        GetModuleBaseName( hProcess, hMod, szProcessName,
                           sizeof(szProcessName)/sizeof(TCHAR) );
    }
}
CloseHandle(hProcess);
long pid = (long)p;

アプリケーションが C# であることは承知していますが、これらの Windows API 呼び出しの一部を使用して、必要な情報を取得できる可能性があります。コードをさらに説明するためにできることがあれば教えてください。

于 2013-03-28T20:13:52.133 に答える