PDA

Показать полную графическую версию : WinAPi приложение поверх всех окон


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

WinAPI & C++....

DillerInc
14-06-2006, 01:48
XCodeR
Код на С++ привести не могу,но принцип будет такой,что главное окно приложения создаёшь функцией CreateWindowEx (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindowex.asp) и в качестве первого параметра передаёшь ей стиль WS_EX_TOPMOST.
А если уничтожить,то тогда DestroyWindow (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/destroywindow.asp).
А отлавливать неактивность окна можно анализируя сообщения в оконной функции(WindowProc) твоего приложения.В данном случае нас будет интересовать сообщение WM_ENABLE (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_enable.asp).

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

DillerInc
15-06-2006, 19:51
pva
Тогда уж WM_ACTIVATEAPP.

pva
16-06-2006, 17:02
Согласен

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

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

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

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

*с = за

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

DillerInc
24-06-2006, 01:11
Может можно как-нибудь сделать таймер ожидания?
...можно использовать функцию Sleep (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp),чтобы дать запускаемому приложению чуток разгуляться.Оформить можно в цикле типа repeat..until.

pva
24-06-2006, 09:04
Есть на этот случай полезная функция WaitForInputIdle.

PROCESS_INFORMATION pi;

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

Maksim V
05-07-2007, 23:15
Здраствуйте. Давно интересовался данной опцией. Помогите пожалуйста с исходным кодом. Итак у меня код вида:

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

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

DillerInc
06-07-2007, 02:18
Итак у меня код вида
...весьма убедительный код :)

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

В любом случае это можно сделать с помощью функции SetWindowPos (http://msdn2.microsoft.com/en-us/library/ms633545.aspx),передавая ей в качестве второго параметра флаг HWND_TOPMOST или HWND_BOTTOM, т.е. поверх или поднизом всех окон.

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

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

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

Maksim V
06-07-2007, 09:34
А... :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
Maksim V
В общем,прикрепляю небольшой исходник со скомпилированной программкой на облегчённых Дельфях.
Облегчённые Дельфи -- это полный отказ от VCL, т.е. использование только WinAPI.Основной плюс -- минимальный(для Дельфи) размер выходного исполняемого файла.

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

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

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

P.P.S. Assembler forever!!

Maksim V
06-07-2007, 22:37
Спасибо. :) Разобрался. :)Вот кому интересно будет, приаттачил архив.

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

Новичок_Андрей
15-03-2012, 17:56
Всем привет. У меня возникает такая сложность. Использую VB 6.0.
Моя форма как и должно быть становиться поверх других окон, но не поверх панели быстрого запуска. Т. е. если форма находиться в открытом состоянии на панели быстрого запуска, то при клике на саму панель, форма прячется под эту самую панель. Что можно сделать?

Drongo
15-03-2012, 18:39
но не поверх панели быстрого запуска »Я так понимаю, имелась ввиду - панель задач.

Новичок_Андрей
15-03-2012, 18:55
Я так понимаю, имелась ввиду - панель задач. »
Ага. Извиняюсь за кривословие :)




© OSzone.net 2001-2012