home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / Folder_loc2070916152007.psc / CInstanceMonitor.cls < prev    next >
Text File  |  2007-06-15  |  6KB  |  184 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "CInstanceMonitor"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. 'Dieser Source stammt von http://www.activevb.de
  15. 'und kann frei verwendet werden. Fⁿr eventuelle SchΣden
  16. 'wird nicht gehaftet.
  17. '
  18. 'Um Fehler oder Fragen zu klΣren, nutzen Sie bitte unser Forum.
  19. 'Ansonsten viel Spa▀ und Erfolg mit diesem Source !
  20. '
  21.  
  22. '****************************************
  23. '* CInstanceMonitor.cls                 *
  24. '* Enables unidirectional communication *
  25. '* to the first instance of the program *
  26. '* Programmed: Achim Neubauer           *
  27. '* Last Change: 07.03.2004 16:07        *
  28. '* Version: 1.0.1                       *
  29. '****************************************
  30.  
  31. Option Explicit
  32.  
  33. '*****************************************************
  34. '* Edit this constant to a unique ID of your program *
  35.    Private Const ProgramID As String = "LockingFolderApplication"
  36. '*****************************************************
  37.  
  38. 'API Deklarationen
  39.  
  40. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  41.  
  42. Private Declare Function RegisterClass Lib "user32.dll" Alias "RegisterClassA" (lpWndClass As WNDCLASS) As Long
  43. Private Declare Function UnregisterClass Lib "user32.dll" Alias "UnregisterClassA" (ByVal lpClassName As Any, ByVal hInstance As Long) As Long
  44. Private Declare Function CreateWindowEx Lib "user32.dll" 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
  45.  
  46. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  47. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  48.  
  49. Private Type COPYDATASTRUCT
  50.   dwData As Long
  51.   cbData As Long
  52.   lpData As Long
  53. End Type
  54.  
  55. Private Type WNDCLASS
  56.   style As Long
  57.   lpfnWndProc As Long
  58.   cbClsExtra As Long
  59.   cbWndExtra As Long
  60.   hInstance As Long
  61.   hIcon As Long
  62.   hCursor As Long
  63.   hbrBackground As Long
  64.   lpszMenuName As String
  65.   lpszClassName As String
  66. End Type
  67.  
  68. Private Const WS_EX_APPWINDOW = &H40000
  69. Private Const WM_CLOSE As Long = &H10
  70. Private Const WM_COPYDATA As Long = &H4A
  71.  
  72. '***
  73.  
  74. Event DataArrival(DataType As Long, Data As String)
  75.  
  76. Private m_hWnd As Long
  77. Private m_hAtom As Long
  78. Private m_PrevInstance As Boolean
  79. Private m_PrevHandle As Long
  80.  
  81. Private Function MakeClassName(ProgramID As String) As String
  82.   MakeClassName = ProgramID & " PrevInstance Monitor"
  83. End Function
  84.  
  85. Private Function FindMonitor() As Long
  86.   If Len(ProgramID) > 0 Then
  87.     FindMonitor = FindWindow(MakeClassName(ProgramID), ProgramID)
  88.   End If
  89. End Function
  90.  
  91. Private Function InstallMonitor() As Boolean
  92.   If Len(ProgramID) = 0 Then Exit Function 'Keine Programm-Idendifikation angegeben.
  93.   
  94.   Dim MonitorClass As WNDCLASS
  95.   Dim result As Long
  96.   
  97.   If m_hAtom = 0 Then
  98.     With MonitorClass
  99.       .style = 0
  100.       .lpfnWndProc = modPrev_Address2Long(AddressOf modPrev_WindowProc)
  101.       .hInstance = App.hInstance
  102.       .lpszClassName = MakeClassName(ProgramID)
  103.     End With
  104.   
  105.     m_hAtom = RegisterClass(MonitorClass)
  106.     If m_hAtom = 0 Then Exit Function 'Fensterklasse konnte nicht registriert werden.
  107.   End If
  108.   
  109.   If m_hWnd = 0 Then
  110.     m_hWnd = CreateWindowEx(WS_EX_APPWINDOW, MakeClassName(ProgramID), ProgramID, _
  111.                             0&, 200&, 200&, 320&, 200&, _
  112.                             0&, 0&, App.hInstance, ByVal 0&)
  113.     If m_hWnd = 0 Then 'Fenster konnte nicht erstellt werden.
  114.       result = UnregisterClass(MakeClassName(ProgramID), App.hInstance)
  115.       If result <> 0 Then 'Fensterklasse konnte deregistriert werden.
  116.         m_hAtom = 0
  117.       End If
  118.     
  119.       Exit Function
  120.     End If
  121.   Else 'Fenster existiert bereits
  122.     Exit Function
  123.   End If
  124.   
  125.   Set modPrev_EventTarget = Me
  126.   
  127.   InstallMonitor = True
  128. End Function
  129.  
  130. Private Sub UninstallMonitor()
  131.   Dim result As Long
  132.   
  133.   If m_hWnd <> 0 Then 'Monitor-Fenster vorhanden.
  134.     Call SendMessage(m_hWnd, WM_CLOSE, ByVal 0&, ByVal 0&)
  135.     m_hWnd = 0
  136.   End If
  137.     
  138.   result = UnregisterClass(MakeClassName(ProgramID), App.hInstance)
  139.   If result <> 0 Then 'Fensterklasse konnte deregistriert werden.
  140.     m_hAtom = 0
  141.   End If
  142. End Sub
  143.  
  144. Public Sub SendData(DataType As Long, Data As String)
  145.   Dim CopyData As COPYDATASTRUCT
  146.   Dim B() As Byte
  147.   
  148.   With CopyData
  149.     .dwData = DataType
  150.     .cbData = Len(Data)
  151.     If Len(Data) > 0 Then
  152.       B = StrConv(Data, vbFromUnicode)
  153.       .lpData = VarPtr(B(0))
  154.     Else
  155.       .lpData = 0&
  156.     End If
  157.   End With
  158.   
  159.   If m_PrevHandle <> 0 Then Call SendMessage(m_PrevHandle, WM_COPYDATA, 0&, CopyData)
  160. End Sub
  161.  
  162. Public Property Get PrevInstance() As Boolean
  163.   PrevInstance = m_PrevInstance
  164. End Property
  165.  
  166. Public Sub InternalEventRaiser(DataType As Long, Data As String)
  167. Attribute InternalEventRaiser.VB_MemberFlags = "40"
  168.   RaiseEvent DataArrival(DataType, Data)
  169. End Sub
  170.  
  171. Private Sub Class_Initialize()
  172.   m_PrevHandle = FindMonitor
  173.   
  174.   If m_PrevHandle = 0 Then
  175.     InstallMonitor
  176.   Else
  177.     m_PrevInstance = True
  178.   End If
  179. End Sub
  180.  
  181. Private Sub Class_Terminate()
  182.   UninstallMonitor
  183. End Sub
  184.