Avatar billede nubi19 Nybegynder
01. marts 2002 - 14:34 Der er 5 kommentarer og
2 løsninger

Always on top i div. progs... ?

Jeg kender til et API kald der kan sætte en form til always on top eller slå det fra igen.
Men jeg vil lave et lille program, der kan slå det til og fra for ANDRE programmer, dvs. jeg skal have et handle oprettet til det program der var i fokus, inden jeg trykkede på knappen i mit program.

Hvordan gør man det / kan det lade sig gøre ?
Avatar billede sjh Nybegynder
01. marts 2002 - 15:04 #1
'Prøv koden, og klikke på vindue ikonet på Form1 (system menu)

'-------------------------------------------- Form1 --------------------------------------------
Private Sub Form_Load()
  Call StartHwnd(Me.Caption)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Call SlutHwnd(Me.Caption)
End Sub
'-------------------------------------------- Form1 --------------------------------------------



'-------------------------------------------- Module1 --------------------------------------------
Public Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long

Public Type MENUITEMINFO
  cbSize As Long
  fMask As Long
  fType As Long
  fState As Long
  wID As Long
  hSubMenu As Long
  hbmpChecked As Long
  hbmpUnchecked As Long
  dwItemData As Long
  dwTypeData As String
  cch As Long
End Type

Public Const MIIM_STATE = &H1
Public Const MIIM_ID = &H2
Public Const MIIM_TYPE = &H10
Public Const MFT_SEPARATOR = &H800
Public Const MFT_STRING = &H0
Public Const MFS_ENABLED = &H0
Public Const MFS_CHECKED = &H8

Public Declare Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long
Public Declare Function SetMenuItemInfo Lib "user32.dll" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long
Public Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1

Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = -4

Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_SYSCOMMAND = &H112
Public Const WM_INITMENU = &H116

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public pOldProc As Long
Public ontop As Boolean

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Dim hSysMenu As Long
  Dim mii As MENUITEMINFO
  Dim retval As Long
 
  Select Case uMsg
  Case WM_INITMENU
    hSysMenu = GetSystemMenu(hwnd, 0)
    With mii
      .cbSize = Len(mii)
      .fMask = MIIM_STATE
      .fState = MFS_ENABLED Or IIf(ontop, MFS_CHECKED, 0)
    End With
    retval = SetMenuItemInfo(hSysMenu, 1, 0, mii)
    WindowProc = 0
  Case WM_SYSCOMMAND
    If wParam = 1 Then
      ontop = Not ontop
      retval = SetWindowPos(hwnd, IIf(ontop, HWND_TOPMOST, HWND_NOTOPMOST), 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
      WindowProc = 0
    Else
      WindowProc = CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam)
    End If
  Case Else
    WindowProc = CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam)
  End Select
End Function

Public Function StartHwnd(snavn As String) As Boolean
Dim hSysMenu As Long
Dim count As Long
Dim mii As MENUITEMINFO
Dim retval As Long
Dim lhWnd As Long
lhWnd = FindWindow(vbNullString, snavn)

  If lhWnd <> 0 Then
    hSysMenu = GetSystemMenu(lhWnd, 0)
    count = GetMenuItemCount(hSysMenu)
   
    With mii
      .cbSize = Len(mii)
      .fMask = MIIM_ID Or MIIM_TYPE
      .fType = MFT_SEPARATOR
      .wID = 0
    End With
    retval = InsertMenuItem(hSysMenu, count, 1, mii)
    With mii
      .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
      .fType = MFT_STRING
      .fState = MFS_ENABLED
      .wID = 1
      .dwTypeData = "&Always On Top"
      .cch = Len(.dwTypeData)
    End With
    retval = InsertMenuItem(hSysMenu, count + 1, 1, mii)
    ontop = False
    pOldProc = SetWindowLong(lhWnd, GWL_WNDPROC, AddressOf WindowProc)
    StartHwnd = True
      Else
    StartHwnd = False
  End If
End Function

Public Function SlutHwnd(snavn As String) As Boolean
Dim retval As Long
Dim lhWnd As Long
  lhWnd = FindWindow(vbNullString, snavn)
  If lhWnd <> 0 Then
    retval = SetWindowLong(lhWnd, GWL_WNDPROC, pOldProc)
    retval = GetSystemMenu(lhWnd, 1)
    SlutHwnd = True
      Else
    SlutHwnd = False
  End If
End Function
'-------------------------------------------- Module1 --------------------------------------------
Avatar billede joha0147 Nybegynder
01. marts 2002 - 15:19 #2
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=13914&lngWId=1

det er vidst lige det du står og mangler! :D

joha0147
Avatar billede joha0147 Nybegynder
01. marts 2002 - 15:23 #3
en meget nem måde at kontrollere andre programmer! Der er en masse dejlige funktioner! Og det fylder ikke særligt meget! :d
Avatar billede thda Nybegynder
01. marts 2002 - 23:46 #4
lytter lige med
Avatar billede joha0147 Nybegynder
04. marts 2002 - 12:26 #5
sig mig synes du ikke du har fået hjælp nok???
Avatar billede nubi19 Nybegynder
04. marts 2002 - 12:33 #6
I må meget undskylde, jeg har ikke haft mulighed for at komme på Internettet de sidste par dage. Men i har hermed fået jeres point, endnu engang undskyld.
Avatar billede joha0147 Nybegynder
04. marts 2002 - 15:03 #7
np! Takker for points! Håber du kunne bruge det til noget§
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester