Показать полную графическую версию : WinAPi приложение поверх всех окон
Простой вопрос.
необходимо открыть приложение(например "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).
Нас интересует WM_ACTIVATE (если речь идёт о переключении Alt+Tab). Ещё можно SetWindowPos(hwnd, HWND_TOPMOST, ....);
DillerInc
15-06-2006, 19:51
pva
Тогда уж WM_ACTIVATEAPP.
лавное окно приложения создаёшь функцией CreateWindowEx
я имел ввиду, что мне нужно открыть "чужое" приложение.
Например функцией CreateProcess. Но там я не нашел, где можно поставить свойство alwaysontop....
DillerInc
20-06-2006, 01:33
XCodeR
Откуда вы товарищ вообще взяли этот "alwaysontop"??
Если речь идёт о чужом приложении,то тогда запускайте его,находите его главное окно(FindWindow) и используйте функцию SetWindowPos с параметром HWND_TOPMOST(как предложил pva).
фактически получилось, но вот проблема, программа("внешняя") открывается через какое-то время, а => её не найти с помощью FindWindow.
Может можно как-нибудь сделать таймер ожидания?... или взять хендл приложения(окна) сразу после выхова CreateProcess...
пора взяться с WinApi....((((
*с = за
Запуститься и тупо каждые 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.
Есть на этот случай полезная функция 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.
Моя форма как и должно быть становиться поверх других окон, но не поверх панели быстрого запуска. Т. е. если форма находиться в открытом состоянии на панели быстрого запуска, то при клике на саму панель, форма прячется под эту самую панель. Что можно сделать?
но не поверх панели быстрого запуска »Я так понимаю, имелась ввиду - панель задач.
Новичок_Андрей
15-03-2012, 18:55
Я так понимаю, имелась ввиду - панель задач. »
Ага. Извиняюсь за кривословие :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.