2011-03-01 3 views
0

Windows API имеет метод, называемый GetForegroundWindow. Но при щелчке по нему он рассматривает Рабочий стол как окно переднего плана. Мы все знаем, что когда это произойдет, предыдущее окно переднего плана не накладывается на него. Как получить реальный дескриптор окна переднего плана?Как получить окно переднего плана в Windows?

+3

Предположим, у вас есть два видимых окна над рабочим столом. Какой из них является «реальным» передним окном после нажатия на рабочем столе? –

+1

Было бы полезно узнать, чего вы пытаетесь достичь. Ваш вопрос, как написано, не имеет смысла. –

+0

Это, конечно, не нормальное поведение, которое никогда не было видно ни на одной из моих машин. Остерегайтесь «надстроек», которые пытаются подражать десктопу. –

ответ

3

Я думаю, что вы переоцениваете свое решение. Если ваше окно приложения не является окном переднего плана при получении обновления, запустите окно. Пункт мигания заключается в том, чтобы привлечь внимание пользователя, и у вас нет способа определить, есть ли у вас их внимание программно.

Похоже, что вы действительно хотите знать: «Является ли часть моего окна, которая изменяется в настоящее время на вид пользователя?» Это довольно сложный вопрос для ответа, и даже если вы ответите правильно, у вас нет способа узнать, заметит ли пользователь изменение.

+0

Я просто хочу его реализовать, потому что я протестировал другое приложение (Google Talk), и оно работает, как я описываю. –

+0

@Jader: даже если вы полны решимости сделать это, найти окно «переднего плана» - это не путь, как отметил Питер в своем комментарии к вашему вопросу, может быть более одного (и они могут не быть затенение * вашего * окна в любом случае). Если вы просто хотите узнать, может ли пользователь * видеть * ваше окно, я подозреваю, что изучение области отсечения (для ** вашего ** окна) - это путь ... но это тема для другого вопроса. – Shog9

1

И «рабочий стол» (Explorers рабочий стол ListView поверх реального окна рабочего стола) и панель задач настоящие окна, где пользователь может быть «рабочий» (Tab'ing вокруг, используя меню и т.д.)

Если вы хотите, чтобы найти «реальное» окно переднего плана, что плохо вы должны найти его самостоятельно, лучше будет для окна в верхней части г-го порядка, может быть что-то вроде:

... enumfunc(hwnd,...) 
{ 
    if (GetClassName(hwnd)!= "Shell_TrayWnd") 
    { 
     if (IsWindowEnabled(hwnd) && IsWindowVisible(hwnd) && GetWindow(hwnd,GW_OWNER)==NULL) 
     { 
      DoSomethingWithRealForegroundWindow(hwnd) 
      return FALSE 
     } 
    } 
} 

EnumWindows(enumfunc,0) 

TaskSwitchXP является открытым источник замены alt-tab, он, вероятно, имеет лучший алгоритм, который вы можете использовать ...

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