Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Always on top Добавлено: 15.09.08 17:36  

Автор вопроса:  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

Private Const WM_WINDOWPOSCHANGED = &H47

Private Const SW_SHOWNORMAL = 1
Private Const IDC_ARROW = 32512&
Private Const CS_HREDRAW = &H2
Private Const CS_VREDRAW = &H1
Private Const COLOR_WINDOW = 5
Private Const IDI_APPLICATION = 32512&
Private Const WM_PAINT = &HF
Private Const WM_KEYDOWN = &H100
Private Const WM_CLOSE = &H10
Private Const WM_DESTROY = &H2

Private Const WM_WINDOWPOSCHANGING = &H46

Private Const WS_OVERLAPPED = &H0&
Private Const WS_CAPTION = &HC00000                  '  WS_BORDER Or WS_DLGFRAME
Private Const WS_SYSMENU = &H80000
Private Const WS_THICKFRAME = &H40000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const CW_USEDEFAULT = &H80000000
Private Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)

Const ClassName = "SimpleWinClass"
Const AppName = "Main"

Dim hInstance As Long
Dim iconD As Long
Dim cursorD As Long
Dim hwnd As Long
Dim wc As WNDCLASSEX
Dim data As String

Sub main()
    Dim message As MSG
    

    
    hInstance = GetModuleHandle(0)
   
    wc.cbSize = Len(wc) 'sizeof
    wc.style = CS_HREDRAW Or CS_VREDRAW
    wc.lpfnWndProc = forAddressof(AddressOf WindowProc)
    wc.cbClsExtra = 0
    wc.cbWndExtra = 0
    wc.hInstance = hInstance
    'wc.hInstance = App.hInstance
    wc.hbrBackground = COLOR_WINDOW
    wc.lpszMenuName = 0
    wc.lpszClassName = ClassName
    iconD = LoadIcon(0, IDI_APPLICATION) ''api function
    wc.hIcon = iconD
    wc.hIconSm = iconD
    cursorD = LoadCursor(0, IDC_ARROW) 'api function
    
    Call RegisterClassEx(wc)  'api function registraciya nashogo klasa vikna
    
    'hwnd = CreateWindowEx(0, ClassName, AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, App.hInstance, 0)
    hwnd = CreateWindowEx(0, ClassName, AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0)
    
    ShowWindow hwnd, SW_SHOWNORMAL
    UpdateWindow hwnd
    'SetFocus hwnd
    
    Do While 0 <> GetMessage(message, 0&, 0&, 0&)
        TranslateMessage message
        DispatchMessage message
    Loop

    'main = message.wParam
End Sub

Public Function WindowProc(ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  
    Select Case message
    
        Case WM_KEYDOWN
           
            Call PostMessage(hwnd, WM_CLOSE, 0, 0)
            Exit Function
    
        Case WM_WINDOWPOSCHANGING
           'попытки отлова ухода на задний план
            BringWindowToTop (hwnd)
        Case WM_DESTROY
            
            
            PostQuitMessage 0&
            Exit Function
    
        Case Else
            WindowProc = DefWindowProc(hwnd, message, wParam, lParam)
            
    End Select

End Function

Private Function forAddressof(addr As Long)
    forAddressof = addr
End Function

Ответить

  Ответы Всего ответов: 25  

Номер ответа: 1
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #1 Добавлено: 15.09.08 17:45
Нафига столько букаф?) в модуль:
  1. Public Declare Function SetWindowPos Lib "user32" _
  2.        (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
  3.         ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
  4.         ByVal cy As Long, ByVal wFlags As Long) As Long
  5.     Public Const HWND_NOTOPMOST = -2
  6.     Public Const HWND_TOPMOST = -1
  7.     Public Const SWP_NOACTIVATE = &H10
  8.     Public Const SWP_NOMOVE = &H2
  9.     Public Const SWP_NOSIZE = &H1
  10.  
  11.     Public Sub SetFormPosition(frmHandl As Long, TopPosition As Boolean)
  12.           If TopPosition Then
  13.                SetWindowPos frmHandl, HWND_TOPMOST, 0, 0, 0, 0, _
  14.                             SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE
  15.            Else
  16.                SetWindowPos frmHandl, HWND_NOTOPMOST, 0, 0, 0, 0, _
  17.                             SWP_NOSIZE Or SWP_NOMOVE
  18.            End If
  19.     End Sub

в любую процедуру:
call SetFormPosition(Me.hwnd, True)

Ответить

Номер ответа: 2
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #2 Добавлено: 15.09.08 21:51
ппц) чет я не тем местом читал вопрос) сорри)

у меня есть ниипацца умный вариант) таймер с кодом "Me.Show" *CRAZY*

Ответить

Номер ответа: 3
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #3
Добавлено: 15.09.08 21:54
@lex спасиба канешо но ты меня не понял.Если после твоего окна напрмер откроетса винамп то он перекроет твою прогу.
У меня задача узнать когда моя прога уйдет на адний план.Читал что то про Z последовальность окон но как получить где находитса мое окно не розобралса

Ответить

Номер ответа: 4
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #4
Добавлено: 15.09.08 22:38
ну выводи каждые 5 секунд свое окно поверх всех)
юзабельно имхо

Ответить

Номер ответа: 5
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #5
Добавлено: 15.09.08 22:48
кстати если использовать в твоем коде SetWindowPos
То вроде работает

Ответить

Номер ответа: 6
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #6
Добавлено: 15.09.08 23:28
С таймером 3 проблеми
во первих этот код я буду переписывать на асм.а как на асме зделать таймер хз.
Во вторих хочетса как то покруче
во третих зачем израсходывать лишние ресурси

Ответить

Номер ответа: 7
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #7 Добавлено: 16.09.08 01:42
Docal пишет:
зачем израсходывать лишние ресурси

угу) лучше израсходовать лищние мозги, придумывая извращенный способ *CRAZY*

Ответить

Номер ответа: 8
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #8
Добавлено: 16.09.08 17:36
Docal, так всё таки если взять твой пример и вфигачить в него SetWindowPos, разве не заработает?

Ответить

Номер ответа: 9
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #9
Добавлено: 16.09.08 18:01
2Winand
Дело не в єтом если я куданить прецыплю SetWindowsos то оно будет роботать например я вставлю
  1. hwnd = CreateWindowEx(0, ClassName, AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0)
  2.     
  3.     ShowWindow hwnd, SW_SHOWNORMAL
  4.     UpdateWindow hwnd
  5.     'SetFocus hwnd
  6.     
  7. ''' <<<<<<<<<<<<<<<<<<<<<<<<< вот сюда
  8.  
  9.     Do While 0 <> GetMessage(message, 0&, 0&, 0&)


Да моя прога запуститса .Содаст форму которая будет поверх всех но если я запущу WINAMP или еще какуюнить прогу которая испольует SetWindowsPos для того что бы выйти на передний план то моя прога уйдет под неё.и вот десь както только моя прога узнает что она уша на другую позицію должна віполнить ещё раз SETWindowsPOs вопрос только в одном как не использу таймер зделать вот єто.Надеюсь ясно разяснил задачу

Ответить

Номер ответа: 10
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #10
Добавлено: 16.09.08 18:18
Воткни в WindowProc, только переименуй переменную хэндлом основного окна (hwnd) в MainHwnd, чтоб она с именем параметра WindowProc не совпадала и сдлай
  1. Public Function WindowProc(ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  2.    BringWindowToTop (MainHwnd)
  3.     Select Case message

Ответить

Номер ответа: 11
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #11
Добавлено: 16.09.08 22:38
всё гениаль просто:))))
при любых сообщения от системы выскакивать на верх.
Не ну это точно перебор за 15-20 секунд а то и менше пришло 3000 команд это 3000 раз выскакивать наверх *CRAZY*.
Если Executioner ничего не сказал тогда наверно придетса использывать таймер.:(

Ответить

Номер ответа: 12
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #12
Добавлено: 17.09.08 10:12
Я просто еще толком не думал. Попробуй по WM_PAINT или WM_RESIZE перерисовывать.

Ответить

Номер ответа: 13
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #13
Добавлено: 17.09.08 17:28
ок, тогда вопрос. В каких случаях отправляется WM_WINDOWPOSCHANGING?

Ответить

Номер ответа: 14
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #14
Добавлено: 17.09.08 20:19
Сообщение WM_WINDOWPOSCHANGING посылается окну, чей размер, позиция, или место в Z-последовательности собирается измениться в результате обращения к функции SetWindowPos или другой функции управления окна.


у меня кажысь оно не заработало видимо винда какимто другим способом перемещает окна по z-последовательности

Ответить

Номер ответа: 15
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #15
Добавлено: 17.09.08 23:07
Дело в том, что тут рекурсия небольшая получается. Когда ы вызываешь SetWindowPos, окну посылается сообщение WM_WINDOWPOSCHANGING. Ты видишь, что оно пришло и снова вызываешь SetWindowPos.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам