Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

  Вопрос: Хук Добавлено: 23.01.05 21:18  

Автор вопроса:  CyRax  | Web-сайт: basicproduction.nm.ru | ICQ: 204447456 
Нужно ловить сообщения окна чужого процесса. Киньте ссылку или пример. Или это можно сделать через SetWindowLong?

Ответить

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

Номер ответа: 1
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 23.01.05 21:40
 Вероятно мне нужен SetWindowsHookEx с идентификатором WH_CALLWNDPROC (или WH_CALLWNDPROCRET). Есть пример у кого?

Ответить

Номер ответа: 2
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #2 Добавлено: 23.01.05 22:04
Есть только с WH_MOUSE и тот на асме. Насколько я знаю, WH_CALLWNDPROC немного отличается от WH_MOUSE. Dll, в которой реализуется хук, надо внедрять в адресное пространство чужого процесса. И компилится она со специфичными ключами (где-то был батник).

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 23.01.05 22:36
http://clifftown.narod.ru/HDK/HDK21.zip

Ответить

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



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 24.01.05 04:18
По этой ссылке Опера грузит пустой архив, а ИЕ выдаёт ошибку.

Ещё вопрос.
 Не буду томить, это связано с аддоном для PB IDE. Нужно ловить показ файлового диалога и активацию MDI-child окон.

Ответить

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



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #5
Добавлено: 24.01.05 04:24
 Два дня не вылазил из OllyDbg в поисках способа извлечения текста из редактора. Остальное - дело техники. Ловить нажатие клавишь "точка", "пробел", "скобки", "Ввод" и перегружать инклюды при соответствующих событиях.

Ответить

Номер ответа: 6
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #6
Добавлено: 24.01.05 04:31

надо внедрять в адресное пространство чужого процесса.

 Я и сам подумывал насчёт использования CreateRemoteThread, но никогда с последним не работал и не знаю какие подводные камни могут меня ожидать.

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 24.01.05 07:18
Хм, прикол получился. Запускаю прогу, состоящую единственно из вызова хука клавы в DLL.
После этого прога завершается, а DLL-ка c хуком остаётся. И ни задачник ни TaskInfo её не видят (во всяком случае в Windows'98).

Ответить

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



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #8
Добавлено: 24.01.05 10:46
Вероятно используют др. процессы...

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 24.01.05 10:55
Но вообще странно. Экзешник на ПБ и ДЛЛ-ка тоже на ПБ. По идее она должна грузиться в тот же процесс. А на деле чёрт знает что получается. Прога вызывает функцию из DLL, которая в свою очередь вызывает CallBack-функцию при помощи SetWindowsHook.

Function PbMain
 ;DllHook
End Function


Function DllHook Alias";DllHook";() Export As Long
 ...
End Function

Ответить

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



Вопросов: 117
Ответов: 1538
 Профиль | | #10 Добавлено: 24.01.05 12:21
@echo off

\masm32\bin\ml /c /coff /Cp C:\masm32\RadASM\Masm\Projects\VBScroll\MHook\MHook.asm

\masm32\bin\Link /SECTION:.bss,S  /DLL /DEF:mhook.def /SUBSYSTEM:WINDOWS /LIBPATH:\masm32\lib mhook.obj

pause


Это бат. Для линкера нужно указать разделяемые секции. SECTION:.bss,S, чтобы можно было соваться в чужой процесс.

Ответить

Номер ответа: 11
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 24.01.05 17:52
Думаю что обойдусь клавиатурной ловушкой. Если будут сложности тогда уже буду пробовать другие варианты.

Ответить

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



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #12
Добавлено: 26.01.05 05:07
Глобальные переменные обнуляются. Что делать? Может в реестре сохранять?

Ответить

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



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 26.01.05 08:52
Оказалось что ловушка работает в процессе-цели. Пока решил проблему так:

Sub KeyPressed(ByVal wParam As Dword, ByVal lParam As Dword)
 Static hWnd_Local_PBWIN32MAIN As Long
 Dim ProcessID As Long, ProcessID2 As Long, hThread_Main As Long
 MsgBox Hex$(hWnd_Local_PBWIN32MAIN),,Str$(hWnd_Local_PBWIN32MAIN)
 If hWnd_Local_PBWIN32MAIN=0 Then
  ProcessID=GetCurrentProcessId()
  Do
   hWnd_Local_PBWIN32MAIN = FindWindowEx(0&,hWnd_Local_PBWIN32MAIN,"PBWIN32MAIN",ByVal 0&;)
   hThread_Main = GetWindowThreadProcessId(hWnd_Local_PBWIN32MAIN, ProcessID2)
   If ProcessID=ProcessID2 Then Exit Do
  Loop
 End If
End Sub

Function KeyboardProc Alias"KeyboardProc";(ByVal nCode As Integer, ByVal wParam As Dword, ByVal lParam As Dword) Export As Long
 If (lParam And &B10000000000000000000000000000000)=&B10000000000000000000000000000000 Then
  STDOUT Bin$(lParam And &B10000000000000000000000000000000) & " / " & Str$(Len(Bin$(lParam And &B10000000000000000000000000000000)))
 ElseIf (lParam And &B01000000000000000000000000000000)=&B01000000000000000000000000000000 Then
  STDOUT Str$(wParam) &" = " & Chr$(wParam)
  KeyPressed wParam, lParam
 End If
 Function = CallNextHookEx(hhook, nCode, wParam, ByVal lParam)
End Function

Function StartHoook Alias"StartHoook";(ByVal lThreadID As Long, ByVal hWnd_MAIN As Long) Export As Long
 'hWnd_MDI=FindWindowEx(hWnd_MAIN,0&,"MDIClient",ByVal 0&;)
 hhook = SetWindowsHookEx(%WH_KEYBOARD, CodePtr(KeyboardProc), hWndDLL, lThreadID)
End Function


 Правда мне не нравится что в процедуре KeyPressed приходится при каждом вызове проверять hWnd_Local_PBWIN32MAIN на нулевое значение, хотя проверка эта нужна только при первом вызове.

Ответить

Номер ответа: 14
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #14
Добавлено: 30.01.05 05:00
If (lParam And &B10000000000000000000000000000000)=&B10000000000000000000000000000000 Then

Какой ужас! Ты уверен, что это нельзя записать по другому? ;)

Ответить

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



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 30.01.05 08:19
Да, я и написал по другому :)

 If (lParam And &H80000000) = &H80000000 Then

 Мне просто понравилась поддержка двоичного типа записи в PB когда я программировал поддержку сопроцессора в Local Assembler.

 Кстати такое условие не срабатывает для беззнаковых типов. Нужно добавлять идентификатор типа.

 PS: Можно ещё через BT сделать, но здесь по моему это несущественно.

Ответить

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

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



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