Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   WinAPi приложение поверх всех окон (http://forum.oszone.net/showthread.php?t=67116)

XCodeR 11-06-2006 18:01 449518

WinAPi приложение поверх всех окон
 
Простой вопрос.
необходимо открыть приложение(например "pr1.exe") со "свойством" AlwaysOnTop(ну воерх всех окон т.е.)
а потом по желанию закрыть.
И если есть возможность(не обязательно) отловить, когда это приложение станет не активным и так же закрыть....

WinAPI & C++....

DillerInc 14-06-2006 01:48 450315

XCodeR
Код на С++ привести не могу,но принцип будет такой,что главное окно приложения создаёшь функцией CreateWindowEx и в качестве первого параметра передаёшь ей стиль WS_EX_TOPMOST.
А если уничтожить,то тогда DestroyWindow.
А отлавливать неактивность окна можно анализируя сообщения в оконной функции(WindowProc) твоего приложения.В данном случае нас будет интересовать сообщение WM_ENABLE.

pva 15-06-2006 18:58 451103

Нас интересует WM_ACTIVATE (если речь идёт о переключении Alt+Tab). Ещё можно SetWindowPos(hwnd, HWND_TOPMOST, ....);

DillerInc 15-06-2006 19:51 451125

pva
Тогда уж WM_ACTIVATEAPP.

pva 16-06-2006 17:02 451641

Согласен

XCodeR 19-06-2006 08:46 452347

Цитата:

лавное окно приложения создаёшь функцией CreateWindowEx
я имел ввиду, что мне нужно открыть "чужое" приложение.
Например функцией CreateProcess. Но там я не нашел, где можно поставить свойство alwaysontop....

DillerInc 20-06-2006 01:33 452400

XCodeR
Откуда вы товарищ вообще взяли этот "alwaysontop"??
Если речь идёт о чужом приложении,то тогда запускайте его,находите его главное окно(FindWindow) и используйте функцию SetWindowPos с параметром HWND_TOPMOST(как предложил pva).

XCodeR 23-06-2006 22:18 454263

фактически получилось, но вот проблема, программа("внешняя") открывается через какое-то время, а => её не найти с помощью FindWindow.
Может можно как-нибудь сделать таймер ожидания?... или взять хендл приложения(окна) сразу после выхова CreateProcess...

пора взяться с WinApi....((((

*с = за

ivank 23-06-2006 22:25 454266

Запуститься и тупо каждые 0.5 секунды искать требуемое окно? Небольшой лаг, но очень просто. Сложнее - перехватить CreateProcess или CreateWindow(Ex). Или поставить хук на WH_SHELL и ловить HSHELL_WINDOWCREATED. Но по моему, это гораздо муторнее и совсем не нужно.

DillerInc 24-06-2006 01:11 454320

Цитата:

Может можно как-нибудь сделать таймер ожидания?
...можно использовать функцию Sleep,чтобы дать запускаемому приложению чуток разгуляться.Оформить можно в цикле типа repeat..until.

pva 24-06-2006 09:04 454370

Есть на этот случай полезная функция WaitForInputIdle.
Код:

PROCESS_INFORMATION pi;

if (CreateProcess(..., &pi) &&
    WaitForInputIdle(pi.dwProcessId, 5000)==0) // можно INFINITE, но лучше забить, если долго не получается
{
    Sleep(100); // для надёжности, но можно не делать
    ...
    // здесь мучаешь эту прогу
}
else
{
    // отчёт об ошибках, смотришь GetLastError()
}


Maksim V 05-07-2007 23:15 608814

Здраствуйте. Давно интересовался данной опцией. Помогите пожалуйста с исходным кодом. Итак у меня код вида:
Код:

*****
const
MAIN_DIALOG = 101;
STAY_ON_TOP_BOX = 1102;
*****

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

DillerInc 06-07-2007 02:18 608852

Цитата:

Итак у меня код вида
...весьма убедительный код :)

На каком языке-то требуется??

В любом случае это можно сделать с помощью функции SetWindowPos,передавая ей в качестве второго параметра флаг HWND_TOPMOST или HWND_BOTTOM, т.е. поверх или поднизом всех окон.

И потом добавить в WindowProc приложения фильтрацию сообщений WM_COMMAND, чтобы отловить момент установки/снятия т.н. флажка.

Могу написать пробный код(просто самому интересно), но на ассемблере.

XPEHOMETP 06-07-2007 08:54 608926

DillerInc
Цитата:

На каком языке-то требуется??
Это, похоже, создание виндовских окон через функцию CreateDialog, практикуется во многих диалектах бейсика, в т.ч. PowerBasic (хотя в нем это в скрытом от юзера виде).

Maksim V 06-07-2007 09:34 608957

А... :biggrin: Извиняюсь. Пишу на Дельфи. А так просто указал названия ресурсов из res файла. Просто где-то надыбал код:
Код:

var
Inst, HWND : integer;

procedure WindowOnTop;
begin
 HWND := FindWindow(nil, 'APP_NAME');
 SetWindowPos(HWND, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
end;

Он конечно работает, но никак не врублюсь как правильно к чекбоксу его приляпать. А то просто приляпал к кнопке и рад... Где-то видел исходник, но уже наверное все форумы облазил - только и знают как для форм делать, а вот чтобы через WinAPI с диалогами... Смотрел Windows SDK, но там настолько запутано... :(
Вообщем помогите кто чем может. :unsure:

DillerInc 06-07-2007 13:50 609149

Вложений: 1
Maksim V
В общем,прикрепляю небольшой исходник со скомпилированной программкой на облегчённых Дельфях.
Облегчённые Дельфи -- это полный отказ от VCL, т.е. использование только WinAPI.Основной плюс -- минимальный(для Дельфи) размер выходного исполняемого файла.

В общем,изучай исходник.

Цитата:

Смотрел Windows SDK, но там настолько запутано...
...а надо идти сразу на MSDN и там искать,что нужно.

P.S. Если что,то я уже давно не пишу на Дельфи.Могут быть некоторые несуразности.

P.P.S. Assembler forever!!

Maksim V 06-07-2007 22:37 609430

Вложений: 1
Спасибо. :) Разобрался. :)Вот кому интересно будет, приаттачил архив.

Да, кстати, дайте пожалуйста код для меню. Как в Диспетчере задач - отмечаешь галочкой пункт меню и окно поверх других окон. Желательно приаттачтьте исходник.

Новичок_Андрей 15-03-2012 17:56 1880086

Всем привет. У меня возникает такая сложность. Использую VB 6.0.
Моя форма как и должно быть становиться поверх других окон, но не поверх панели быстрого запуска. Т. е. если форма находиться в открытом состоянии на панели быстрого запуска, то при клике на саму панель, форма прячется под эту самую панель. Что можно сделать?

Drongo 15-03-2012 18:39 1880130

Цитата:

Цитата Новичок_Андрей
но не поверх панели быстрого запуска »

Я так понимаю, имелась ввиду - панель задач.

Новичок_Андрей 15-03-2012 18:55 1880142

Цитата:

Цитата Drongo
Я так понимаю, имелась ввиду - панель задач. »

Ага. Извиняюсь за кривословие :)


Время: 15:51.

Время: 15:51.
© OSzone.net 2001-