2013-02-25 3 views
3

C# GetForegroundWindow() возвращает тот же результат для нескольких окон, EnumWindows на самом деле не возвращает это окно вообще. У каждого процесса действительно есть свой уровень.C# GetForegroundWindow() возвращает тот же результат для нескольких окон, EnumWindows на самом деле не возвращает это # ​​вообще

Я также прошел через обе функции GetWindowThreadProcessId() и перечислил через них GetChildWindows(), но все же они не возвращают то же окно, что и GetForegroundWindow().

Как правильно начать с GetForegroundWindow() и превратить его в то, что вы извлекли из надлежащего EnumWindows?

Goal: 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; 
} 
+0

Вы имеете в виду, что результат из 'EnumWindows' не содержит окна, возвращаемого из' GetForegroundWindow'? – Default

+0

не совсем .. он получает лучшие результаты, но не отдельные результаты. – ploxtic

+0

Кто-нибудь дал это? – ploxtic

ответ

0

Вот что я использую для C++ в Windows:

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#, но возможно, вы можете использовать некоторые из этих API Windows, требует, чтобы получить необходимую информацию. Сообщите мне, есть ли что-нибудь, что я могу сделать, чтобы еще больше объяснить код.

 Смежные вопросы

  • Нет связанных вопросов^_^