Автор вопроса: D o c a l | Web-сайт:www.doc-source.pp.net.ua/ | ICQ: 408802757
Задача что бы окно всегда было поверх остальных.
Юзаю SetWindowPos Main.hWnd, -1, 0, 0, 0, 0, &H50. -vb
всё прекрасно.но если вдруг запуститса прога котрая тоже себе зделает always on top через SetWindowsPos то моя прога будет под ней что не допустимо.
Вопрос как мне отловить что мою програму перекрыла какаю нибудь другая програма
код который уже есть :
Option Explicit
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As String) As Long
Private Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As String) As Long
Private Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (pcWndClassEx As WNDCLASSEX) As Integer
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Private Type WNDCLASSEX
cbSize As Long
style As Long
lpfnWndProc As Long
cbClsExtra As Long
cbWndExtra As Long
hInstance As Long
hIcon As Long
hCursor As Long
hbrBackground As Long
lpszMenuName As String
lpszClassName As String
hIconSm As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
@lex спасиба канешо но ты меня не понял.Если после твоего окна напрмер откроетса винамп то он перекроет твою прогу.
У меня задача узнать когда моя прога уйдет на адний план.Читал что то про Z последовальность окон но как получить где находитса мое окно не розобралса
С таймером 3 проблеми
во первих этот код я буду переписывать на асм.а как на асме зделать таймер хз.
Во вторих хочетса как то покруче
во третих зачем израсходывать лишние ресурси
Да моя прога запуститса .Содаст форму которая будет поверх всех но если я запущу WINAMP или еще какуюнить прогу которая испольует SetWindowsPos для того что бы выйти на передний план то моя прога уйдет под неё.и вот десь както только моя прога узнает что она уша на другую позицію должна віполнить ещё раз SETWindowsPOs вопрос только в одном как не использу таймер зделать вот єто.Надеюсь ясно разяснил задачу
Воткни в WindowProc, только переименуй переменную хэндлом основного окна (hwnd) в MainHwnd, чтоб она с именем параметра WindowProc не совпадала и сдлай
всё гениаль просто)))
при любых сообщения от системы выскакивать на верх.
Не ну это точно перебор за 15-20 секунд а то и менше пришло 3000 команд это 3000 раз выскакивать наверх .
Если Executioner ничего не сказал тогда наверно придетса использывать таймер.
Сообщение WM_WINDOWPOSCHANGING посылается окну, чей размер, позиция, или место в Z-последовательности собирается измениться в результате обращения к функции SetWindowPos или другой функции управления окна.
у меня кажысь оно не заработало видимо винда какимто другим способом перемещает окна по z-последовательности
Дело в том, что тут рекурсия небольшая получается. Когда ы вызываешь SetWindowPos, окну посылается сообщение WM_WINDOWPOSCHANGING. Ты видишь, что оно пришло и снова вызываешь SetWindowPos.