Хук на msgbox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Хук на msgbox

Сообщение ALX_2002 » 24.11.2004 (Ср) 20:09

Челы, я в упор забыл, как это делается и найти не могу. Кому не влом примерсик киньте плззз....

Мне надо перехватить мессагу (msgbox) другой проги и прочитать из неё текст.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.11.2004 (Ср) 21:32

FindWindowEx и GetWindowText достаточно... С примерчиком не помогу :-(
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 24.11.2004 (Ср) 22:06

Поищи на www.rsdn.ru , там как раз был пример хука и именно на MsgBox (т.е. на MessageBox, конечно).

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 24.11.2004 (Ср) 23:57

2 tyomitch: Шеф, если человек просит хук, это значит ему нужен именно хук, а не getwindowtext, о котором знают все :flower: :afro:
Но всё равно спасибо. :wink:

2 Ennor: Ща попробую... Эх... ( Разминает пальцы ) и вползает в сеть интернет...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.11.2004 (Чт) 0:18

ALX_2002 писал(а):2 tyomitch: Шеф, если человек просит хук, это значит ему нужен именно хук, а не getwindowtext, о котором знают все :flower: :afro:

А почему ты думаешь, что GetWindowText недостаточно?
И как, ты думаешь, хук может тебе помочь? Максимум, что ты получишь - hWnd месседжбокса; а потом придётся юзать тот же GetWindowText.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.11.2004 (Чт) 10:44

Он наверное хочет сказать, что ему не нужен таймер, на который придется цеплять GetWindowText, он хочет события.
Lasciate ogni speranza, voi ch'entrate.

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 25.11.2004 (Чт) 13:13

Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 25.11.2004 (Чт) 21:21

2 tyomitch: Шеф, а если не из окна читать, а из памяти, до того как сообщение дошло.... Тогда какой GetWindowText ? :wink:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 25.11.2004 (Чт) 21:22

2 Tarik: Блин.... C... Везде он... Ну похо я в нём варю... Мне б на VB и готовое.... :(

P.S Знаю... Знаю... Я ленив... :roll:

2 alibek: Дисительно шеф. :shock: . Вы прям мысли мои воруете, тьфу... т.е читаете. :)

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 26.11.2004 (Пт) 15:14

А если я хачу поставить хук дапустим на определённую прогу , и чтоб он реагировал на каждое действие проги например обращение к Api (если та прога на катарую поставили хук оброщается ) , вообщем на любые действия косающиеся её и исходчщие от неё ! Мы всё перехватываем выполняем какието действия далее продолзаем работу той проги ! Я пробовал с таким кодом но он работает только на собственную форму или формы относящиеся только к этаму проэкту , дальше молчание !!!

Код: Выделить всё
На форме 2 текстовое поле и кнопка (Text1.Text, Text2.Text , Command1)

В модуль

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Dim hw As Long
Public Sub Hook(Byval wnd)
  hw = FindWindow(vbNullString, "" & wnd)
      If hw = 0 Then
            MsgBox("ERROR")
         Exit Sub
      End If
    PrevProc = SetWindowLong(hw, GWL_WNDPROC, AddressOf WinProc)
End Sub
Public Sub UnHoo()
    SetWindowLong hw, GWL_WNDPROC, PrevProc
End Sub
Public Function WinProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Здесь свой код , какието действия
    Form1.Text1.Text = "HOOK !" - к примеру
  WinProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) - вернули упр проги
End Function

В Форму

Private Sub Form_Unload(Cancel As Integer)
Call UnHook
End Sub
Private Sub Command1_Click()
Call Hook(Text2.Text)
End Sub


Может кто примерчик кинет !?

:wink:
Max!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.11.2004 (Пт) 15:19

ALX_2002, из памяти текст можно будет читать только в том случае, если перехватывать вызов API-функций, а это посложнее будет, чем хук на MessageBox. Я даже не уверен, что на VB это выполнимо (опасливо косится в сторону хардкорщиков, которых хлебом не корми, дай вызвать функцию по указателю... :) )
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.11.2004 (Пт) 15:23

А мы чё, а мы ничё :)
Вон, Tarik ссылку дал, ничё не знаю :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.11.2004 (Пт) 16:19

Трям ! Будем бороться дальше, подумал он ( Открыв форум, улыбка с его лица сползает... Он опирается на локоть и грустно вздыхает...)

:roll:

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 26.11.2004 (Пт) 18:22

Кто селён в асемблере ? Это би смогло помоч мне и ALX_2002! Всё что требуется ЕРЕВЕДИТЕ НА VB

:x

:wink:
Вложения
Test_MessageBoxA.zip
*
(10.08 Кб) Скачиваний: 48
Max!

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 27.11.2004 (Сб) 4:50

Ктонить перевёл ?
:wink:
Только негаворите што нет !!!
:wink:
Max!

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 27.11.2004 (Сб) 20:55

Пытался сам перевести , но чёто неработает , точнее правильно перевести невыходит ! :x :x :x
Max!

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 27.11.2004 (Сб) 21:48

Да лень всем... А чем тебя не устраивает DLL использовать, которая уже есть :?:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 27.11.2004 (Сб) 22:57

Да лень всем...

Возможно !
А чем тебя не устраивает DLL использовать, которая уже есть

Хачу сам написать , имхо надо ведь учится и понять полнастью как работает и тд.....

Вообщем нашол я код каторый мне многое прояснил точно тагже многа и вопросов возникло !!!
На форме 1 кнопка и одно текстовое поле (Command1) , (Text1)
А вот и сам код


Код: Выделить всё

В Модуль

Option Explicit
'misc API constants
Private Const WH_CBT = 5
Private Const GWL_HINSTANCE = (-6)
Private Const HCBT_ACTIVATE = 5

'UDT for passing data through the hook
Private Type MSGBOX_HOOK_PARAMS
   hwndOwner   As Long
   hHook       As Long
End Type

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

'need this declared at module level as
'it is used in the call and the hook proc
Private mhp As MSGBOX_HOOK_PARAMS

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Private Declare Function GetWindowLong Lib "user32" _
   Alias "GetWindowLongA" _
  (ByVal hwnd As Long, _
   ByVal nIndex As Long) As Long

Private Declare Function MessageBox Lib "user32" _
   Alias "MessageBoxA" _
  (ByVal hwnd As Long, _
   ByVal lpText As String, _
   ByVal lpCaption As String, _
   ByVal wType As Long) As Long
   
Private Declare Function SetWindowsHookEx Lib "user32" _
   Alias "SetWindowsHookExA" _
  (ByVal idHook As Long, _
   ByVal lpfn As Long, _
   ByVal hmod As Long, _
   ByVal dwThreadId As Long) As Long
   
Private Declare Function UnhookWindowsHookEx Lib "user32" _
   (ByVal hHook As Long) As Long

Private Declare Function MoveWindow Lib "user32" _
  (ByVal hwnd As Long, _
   ByVal X As Long, _
   ByVal Y As Long, _
   ByVal nWidth As Long, _
   ByVal nHeight As Long, _
   ByVal bRepaint As Long) As Long
   
Private Declare Function GetWindowRect Lib "user32" _
  (ByVal hwnd As Long, _
   lpRect As RECT) As Long
   
Public Function Msgbox(sPrompt As String, _
                       Optional dwStyle As Long, _
                       Optional sTitle As String) As Long

  'replaces VB's built in MsgBox function in VB5/6
 
   Dim hInstance As Long
   Dim hThreadId As Long
   
   If dwStyle = 0 Then dwStyle = vbOKOnly
   If Len(sTitle) = 0 Then sTitle = "VBnet Messagebox Demo"
   
  'Set up the hook
   hInstance = GetWindowLong(Form1.hwnd, GWL_HINSTANCE)
   hThreadId = GetCurrentThreadId()

  'set up the MSGBOX_HOOK_PARAMS values
  'By specifying a Windows hook as one
  'of the params, we can intercept messages
  'sent by Windows and thereby manipulate
  'the dialog
   With MHP
      .hwndOwner = Form1.hwnd
      .hHook = SetWindowsHookEx(WH_CBT, _
                                AddressOf MsgBoxHookProc, _
                                hInstance, hThreadId)
   End With
   
  'call the MessageBox API and return the
  'value as the result of this function
   Msgbox = MessageBox(Form1.hwnd, sPrompt, sTitle, dwStyle)

End Function


Public Function MsgBoxHookProc(ByVal uMsg As Long, _
                               ByVal wParam As Long, _
                               ByVal lParam As Long) As Long
     
   Dim rc As RECT
   
  'temporary vars for demo
   Dim newLeft As Long
   Dim newTop As Long
   Dim dlgWidth As Long
   Dim dlgHeight As Long
   Dim scrWidth As Long
   Dim scrHeight As Long
   Dim frmLeft As Long
   Dim frmTop As Long
   Dim frmWidth As Long
   Dim frmHeight As Long
   Dim hwndMsgBox As Long
   
  'When the message box is about to be shown,
  'centre the dialog
   If uMsg = HCBT_ACTIVATE Then
   
     'in a HCBT_ACTIVATE message, wParam holds
     'the handle to the messagebox
      hwndMsgBox = wParam
             
     'Just as was done in other API hook demos,
     'position the dialog centered in the calling
     'parent form
     
      Call GetWindowRect(hwndMsgBox, rc)
     
      frmLeft = Form1.Left \ Screen.TwipsPerPixelX
      frmTop = Form1.Top \ Screen.TwipsPerPixelY
      frmWidth = Form1.Width \ Screen.TwipsPerPixelX
      frmHeight = Form1.Height \ Screen.TwipsPerPixelX

      dlgWidth = rc.Right - rc.Left
      dlgHeight = rc.Bottom - rc.Top
     
      scrWidth = Screen.Width \ Screen.TwipsPerPixelX
      scrHeight = Screen.Height \ Screen.TwipsPerPixelY
     
      newLeft = frmLeft + ((frmWidth - dlgWidth) \ 2)
      newTop = frmTop + ((frmHeight - dlgHeight) \ 2)
     
      Call MoveWindow(hwndMsgBox, newLeft, newTop, dlgWidth, dlgHeight, True)
     
     
     'done with the dialog so release the hook
      UnhookWindowsHookEx MHP.hHook
               
   End If
   
  'return False to let normal
  'processing continue
   MsgBoxHookProc = False

End Function

В форму

Option Explicit

Private Sub Command1_Click()
 
  'Display the API message box
   Dim sTitle As String
   Dim sPrompt As String
   Dim dwStyle As Long
   
   sTitle = "VBnet MessageBox Hook Demo"
   sPrompt = "This is a demo of the MessageBox API showing how to hook" & vbCrLf & _
             "the dialog and centre it with respect to the parent form."
   dwStyle = vbAbortRetryIgnore Or vbInformation

   Select Case Msgbox(sPrompt, dwStyle, sTitle)
      Case vbRetry:  Text1.Text = "Retry button pressed"
      Case vbAbort:  Text1.Text = "Abort button pressed"
      Case vbIgnore: Text1.Text = "Ignore button pressed"
   End Select
     
End Sub


Этот код даже узнаёт што выбрал пользователь (Какую кнопку он нажал) ! И этот код работает превосходно если вызывать MsgBox из формы или вообще из проэкта ! Например если поставить 2 кнопку и добавить
Код: Выделить всё
MsgBox "Hello"


То этот MsgBox "Hello" тоже перехватывается и изменяется (Видно по заголовку и по типу сообщения ) Ну это всё понятно , всё относится к форме и проэкту .
Внимание вопросс , как можно поставить хук на все MsgBox в виндах и исходящие из других проэктов и прог ??? (Примерно так как в примере каторый на асме. написан)

:wink:
Max!

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 27.11.2004 (Сб) 23:21

Оформить код, как глобальную ловушку в Native DLL

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 28.11.2004 (Вс) 1:00

Всмысле написать DLL'шку ? Немного неврубился , поясни !
:wink:
Max!

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 28.11.2004 (Вс) 12:37

Как тогда узнать hwnd каждого открывшегося MessageBox'a (Заголовки я незнаю дапустим) :?:
Max!

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 29.11.2004 (Пн) 16:50

Как дапустим по классу через FindWindow ?
:wink:
Max!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: The trick, Yandex-бот и гости: 17

    TopList