IsForeground
От: Viktor Sklyar Украина  
Дата: 10.06.04 16:33
Оценка:
Hello All.

Как средствами .NET определить не перекрывается ли окно
другими?

И вообще как это определить?

Нашел функцию WinAPI GetForegroudWindow, но эксперименты
с ней прошли неудачно, может я чего не так делал.

вот мои изыскания на эту тему:

[DllImport("user32.dll")] private static extern 
IntPtr GetForegroundWindow();

private bool IsForeground
{
    get 
    {
        return (GetForegroundWindow() == (IntPtr)Handle);
    }
}


Почему то всегда возвращает false
С Уважением.
Re: IsForeground
От: rus blood Россия  
Дата: 10.06.04 16:41
Оценка: 27 (1)
VS>
........
VS>


VS>Почему то всегда возвращает false


Код работает на ура...

Ты случайно его не под отладчиком проверял?
Имею скафандр — готов путешествовать!
Re[2]: IsForeground
От: Viktor Sklyar Украина  
Дата: 11.06.04 08:55
Оценка:
Здравствуйте, rus blood, Вы писали:

VS>>Почему то всегда возвращает false


RB>Код работает на ура...

RB>Ты случайно его не под отладчиком проверял?

Нет, просто судил я по другому признаку...

а проблема в слудующем:

Есть форма со свойством
ShowInTaskbar = false

есть NotifyIcon, а вот ее обработчик по doubleclick
private void iconNotify_DoubleClick(object sender, System.EventArgs e)
{
    if (Visible)
    {
        if (IsForeground)
        {
            Visible = false;
        }
        else
        {
            Activate();
        }
    }
    else
    {
        Visible = true;
    }
}


думаю всем понятно чего я хотел этим добиться?

Но это не работает
А точнее: тут IsForegroud всегда возвращает false

Помогите решить проблемку, plz
С Уважением.
Re[3]: IsForeground
От: rus blood Россия  
Дата: 11.06.04 09:33
Оценка:
VS>есть NotifyIcon, а вот ее обработчик по doubleclick
VS>
..........
VS>


Ознакомься
Автор: Pushkin_С
Дата: 01.06.04
Имею скафандр — готов путешествовать!
Re[4]: IsForeground
От: Viktor Sklyar Украина  
Дата: 11.06.04 10:02
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Ознакомься
Автор: Pushkin_С
Дата: 01.06.04


ознакомился — проблему-то там так и не решили

так как же поступить?
С Уважением.
Re[3]: IsForeground
От: mihailik Украина  
Дата: 14.06.04 09:40
Оценка:
VS>думаю всем понятно чего я хотел этим добиться?
VS>Но это не работает

Всегда делай Show, Activate — и всех делов.

Кстати, не забудь, что форма может быть в этот момент минимизирована, тогда её ещё нужно развернуть.
... << Rsdn@Home 1.1.4 beta 1 >>
Re: IsForeground
От: Viktor Sklyar Украина  
Дата: 14.06.04 11:27
Оценка:
VS>Hello All.

Исследовал я исходники Миранды. Там данная проблема решена.
Вот кусок кода на C++, который определяет не перекрывается
ли заданное окно другими:

bool IsForeground(HWND hWnd)
{
   bool bResult;
   HDC hdc;
   HRGN hOldClipRgn, hNewClipRgn;

   hdc = GetWindowDC(hWnd);
   hOldClipRgn = CreateRectRgn(0, 0, 0, 0);
   GetRandomRgn(hdc, hOldClipRgn, SYSRGN);
   ReleaseDC(hWnd, hdc);

   SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
   SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
   SetForegroundWindow(hWnd);
   SetFocus(hWnd);

   hdc = GetWindowDC(hWnd);
   hNewClipRgn = CreateRectRgn(0, 0, 0, 0);
   GetRandomRgn(hdc, hNewClipRgn, SYSRGN);
   ReleaseDC(hWnd, hdc);

   bResult = (TRUE == EqualRgn(hNewClipRgn, hOldClipRgn));

   DeleteObject(hOldClipRgn);
   DeleteObject(hNewClipRgn);

   return bResult;
}


Теперь моя проблема перевести этот код по возможности в C#.

Некоторые функции я знаю как перевести: SetWindowPos(), SetFocus().

А как поступить с остальными не знаю...
Особенно интересно что делать GDI-шными функциями.

Помогите пожалуйста разобраться.
С Уважением.
Re[2]: IsForeground
От: orangy Россия
Дата: 14.06.04 11:43
Оценка:
Здравствуйте, Viktor Sklyar, Вы писали:

VS>Некоторые функции я знаю как перевести: SetWindowPos(), SetFocus().


VS>А как поступить с остальными не знаю...

VS>Особенно интересно что делать GDI-шными функциями.

VS>Помогите пожалуйста разобраться.

http://www.pinvoke.net
... << RSDN@Home 1.1.4 beta 1 >>
"Develop with pleasure!"
Re[3]: IsForeground
От: Viktor Sklyar Украина  
Дата: 14.06.04 11:59
Оценка:
Здравствуйте, orangy, Вы писали:

VS>>Помогите пожалуйста разобраться.

O>http://www.pinvoke.net

Сайт конечно интересный, но к сожалению сырой.
Многие вещи там еще предстоит заполнить
(Я даже дописал там, что Unmanaged API SetFocus()
соответствует Managed Focus() )

Для заданной формы:

SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

переходит в
TopMost = true;
TopMost = false;


SetFocus(hWnd);

переходит в
Focus();


Можно чего-нить еще сделать без Unmanaged кода?
С Уважением.
Re[4]: IsForeground
От: Dimonytch  
Дата: 15.06.04 09:13
Оценка: 3 (1)
Здравствуйте, Viktor Sklyar, Вы писали:


VS>Можно чего-нить еще сделать без Unmanaged кода?


Справочник по .NET аналогам Win32 функций:
здесь
Re[2]: IsForeground
От: rus blood Россия  
Дата: 15.06.04 12:09
Оценка:
Здравствуйте, Viktor Sklyar, Вы писали:

VS>>Hello All.


VS>Исследовал я исходники Миранды. Там данная проблема решена.

VS>Вот кусок кода на C++, который определяет не перекрывается
VS>ли заданное окно другими:

VS>
VS>bool IsForeground(HWND hWnd)
VS>{
..........
VS>}
VS>


Этот код всего лишь проверяет, лежит ли окно поверх остальных non-topmost окон.
Кроме того, он переносит окно наверх, делает его foreground, неверно работает для topmost окон (убирает topmost).

То же самое можно сделать через EnumWindows или GetWindow — они перебирают top-level окна в Z-порядке.
Имею скафандр — готов путешествовать!
Re[3]: IsForeground
От: Viktor Sklyar Украина  
Дата: 15.06.04 14:12
Оценка:
Здравствуйте, rus blood, Вы писали:


RB>Этот код всего лишь проверяет, лежит ли окно поверх остальных non-topmost окон.

Не только, самое главное он определяет перекрывается ли окно другими.

[skip]

RB>То же самое можно сделать через EnumWindows или GetWindow — они перебирают top-level окна в Z-порядке.


Хотелось бы взглянуть на рабочий код.
С Уважением.
Re[4]: IsForeground
От: rus blood Россия  
Дата: 15.06.04 14:55
Оценка:
Здравствуйте, Viktor Sklyar, Вы писали:

VS>Здравствуйте, rus blood, Вы писали:



RB>>Этот код всего лишь проверяет, лежит ли окно поверх остальных non-topmost окон.

VS>Не только, самое главное он определяет перекрывается ли окно другими.

Ну, если конечно это то, что ты хотел...

Просто если окно твоего приложения лежит поверх других non-topmost окон, а окно текущего foreground приложения является topmost окном, то эта функция выдает, что foreground-ом является твое приложение, а не то, с которым действительно работает юзер.

Причем, независимо от того, перекрыто твое окно приложения или нет.
Имею скафандр — готов путешествовать!
Re[5]: IsForeground
От: Viktor Sklyar Украина  
Дата: 15.06.04 15:25
Оценка:
RB>>>Этот код всего лишь проверяет, лежит ли окно поверх остальных non-topmost окон.
VS>>Не только, самое главное он определяет перекрывается ли окно другими.
RB>Ну, если конечно это то, что ты хотел...
Конечно, хотя я не совсем понимаю зачем дергать ТорMost,
но основная работа, сдается мне, состоит в проверке
видимости региона заключающего данное окошко, т.е.
если регион не перекрывается другими, то окошко видимо полностью.
С Уважением.
Re[6]: IsForeground
От: rus blood Россия  
Дата: 15.06.04 15:49
Оценка:
VS>Конечно, хотя я не совсем понимаю зачем дергать ТорMost,
VS>но основная работа, сдается мне, состоит в проверке
VS>видимости региона заключающего данное окошко, т.е.
VS>если регион не перекрывается другими, то окошко видимо полностью.

Но это неверно. Окно может быть скрыто полностью или частично другим topmost окном, и эта функция вернет, что все ок, окно foreground.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.