Страница: 1 |
Страница: 1 |
Вопрос: Свой контрол в чужом приложении
Добавлено: 31.03.07 15:36
Автор вопроса: ZagZag | ICQ: 295002202
Реально ли добавить контрол в чужом приложении и обрабатывать его
события? Если да, то как это сделать?
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
W[4Fh]LF
Вопросов: 0
Ответов: 187
Web-сайт:
Профиль | | #1
Добавлено: 31.03.07 16:02
В общем случае никак. Для какой-то отдельной программы подход найти можно, но не всегда.
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 31.03.07 20:03
В моем случае подход нужно найти к стандартному "Калькулятору"
И добавить в его окно свое текстовое поле (уж не спрашивай зачем )
Нахожу hWnd его окна, но GetWindowLong выдает 0 ((
Может как-то подругому надо (с сабкласингом не очень знаком)
В сети не нашел подходящего примера
Номер ответа: 3
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #3
Добавлено: 31.03.07 21:01
W[4Fh]LF
ZagZag
Для добавления контрола используй createwindow,
А зачем вы его используете?
Здесь нужно создать подкласс окна:
wParam As Long, ByVal lParam As Long) As Long
Dim lReturn As Long
lReturn = CallWindowProc (OldWndProc, hwnd, Msg, wParam, lParam)
Select Case Msg 'проверяем сообщения
...
End Select
WindowProc = lReturn 'вернем значение функции
То есть функция CallWindowProc здесь работает - по простому сказать - как событие, которое передает параметр Msg
В зависимости от значения Msg - ловим событие
Номер ответа: 4
Автор ответа:
D o c a l
ICQ: 408802757
Вопросов: 76
Ответов: 985
Web-сайт:
Профиль | | #4
Добавлено: 31.03.07 21:37
Канешно шо реально но я не знаю как.Посмотри на свой "IE" в него вмонтируютса много прог например Download master другое дело што ето било задусамо.Нащет калькулятора не знаю
Номер ответа: 5
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #5
Добавлено: 31.03.07 23:46
Docal, IE поддерживает дополнения (плагины), поэтому с подключением
дополнений проблем не возникает. Но вот калькулятор стандартный
плагины не поддерживает в принципе ))
-АлександР-, я конечно в сабклассинге не очень понимаю, но как делать
сабклассинг знаю и умею. Так почему же GetWindowLong от своего
приложения выдает указатель на оконную процедуру, а GetWindowLong от
окна калькулятора выдает 0.
И сабклассить (SetWindowLong) окно калькулятора у меня не получилось ((
Короче, приведу краткую цель задачи:
Надо в окно калькулятора добавить текстовое поле.
По некоторому событию надо получить текст из этого поля.
У меня без проблем получается добавить свою форму (на которой
есть текстовое поле) в окно калькулятора, но она перестает
перерисовываться (выглядит жутко, но если это как-нибудь
исправить, то задача будет решена).
Номер ответа: 6
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #6
Добавлено: 01.04.07 10:36
ZagZag, Покажи-ка код
Номер ответа: 7
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #7
Добавлено: 01.04.07 11:00
Он и не должен ничего возвращать
Номер ответа: 8
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #8
Добавлено: 01.04.07 11:58
Прошу прощения, чушь написал.
А возвращает ноль, потому что: (читай здесь http://www.firststeps.ru/mfc/winapi/win/r.php?94)
Номер ответа: 9
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #9
Добавлено: 01.04.07 20:38
Хм. А как же быть?
Я ведь стандартный калькулятор запускаю. Значит прийдется копать в
сторону инъекции собственной DLL'ки?
Номер ответа: 10
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #10
Добавлено: 02.04.07 00:00
или в сторону хака копать, очень странно, что HACKER в этой теме ни разу не отметился.
Я уверен, он знает ответ. (смотри, обгонит тебя Sharp)
Номер ответа: 11
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #11
Добавлено: 02.04.07 00:01
или в сторону хака копать, очень странно, что HACKER в этой теме ни разу не отметился.
Я уверен, он знает ответ. (смотри, обгонит тебя Sharp)
Номер ответа: 12
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #12
Добавлено: 02.04.07 00:19
Нужно получить права доступа,
OpenProcess тут как бы д/б
Есть пример, рабочий:
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Type MEMORY_BASIC_INFORMATION ' 28 bytes
BaseAddress As Long
AllocationBase As Long
AllocationProtect As Long
RegionSize As Long
State As Long
Protect As Long
lType As Long
End Type
Private Type SYSTEM_INFO ' 36 Bytes
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (LpVersionInformation As OSVERSIONINFO) As Long
Private Declare Function VirtualQueryEx& Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long)
Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Const GW_HWNDNEXT = 2
Private Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, ByVal lpRect As Long, ByVal bErase As Long) As Long
Const PROCESS_VM_READ = (&H10)
Const PROCESS_VM_WRITE = (&H20)
Const PROCESS_VM_OPERATION = (&H8)
Const PROCESS_QUERY_INFORMATION = (&H400)
Const PROCESS_READ_WRITE_QUERY = PROCESS_VM_READ + PROCESS_VM_WRITE + PROCESS_VM_OPERATION + PROCESS_QUERY_INFORMATION
Const MEM_PRIVATE& = &H20000
Const MEM_COMMIT& = &H1000
'Add 3 labels, 3 textboxes and 1 commandbutton on form
Private Sub Command1_Click()
Dim pid As Long, hProcess As Long, hWin As Long
Dim lpMem As Long, ret As Long, lLenMBI As Long
Dim lWritten As Long, CalcAddress As Long, lPos As Long
Dim sBuffer As String
Dim sSearchString As String, sReplaceString As String
Dim si As SYSTEM_INFO
Dim mbi As MEMORY_BASIC_INFORMATION
sSearchString = Text2
sReplaceString = Text3 & Chr(0)
If IsWindowsNT Then 'NT store strings in RAM in UNICODE
sSearchString = StrConv(sSearchString, vbUnicode)
sReplaceString = StrConv(sReplaceString, vbUnicode)
End If
pid = Shell(Text1) 'launch application (calc.exe in this sample)
hWin = InstanceToWnd(pid) 'get handle of launched window - only to repaint it after changes
'Open process with required access
hProcess = OpenProcess(PROCESS_READ_WRITE_QUERY, False, pid)
lLenMBI = Len(mbi)
'Determine applications memory addresses range
Call GetSystemInfo(si)
lpMem = si.lpMinimumApplicationAddress
'Scan memory
Do While lpMem < si.lpMaximumApplicationAddress
mbi.RegionSize = 0
ret = VirtualQueryEx(hProcess, ByVal lpMem, mbi, lLenMBI)
If ret = lLenMBI Then
If ((mbi.lType = MEM_PRIVATE) And (mbi.State = MEM_COMMIT)) Then ' this block is In use by this process
If mbi.RegionSize > 0 Then
sBuffer = String(mbi.RegionSize, 0)
'Read region into string
ReadProcessMemory hProcess, ByVal mbi.BaseAddress, ByVal sBuffer, mbi.RegionSize, lWritten
'Check if region contain search string
lPos = InStr(1, sBuffer, sSearchString, vbTextCompare)
If lPos Then
CalcAddress = mbi.BaseAddress + lPos
Me.Show
ret = MsgBox("Search string was found at address " & CalcAddress & "." & vbCrLf & "Do you want to replace it?", vbInformation + vbYesNo, "VB-O-Matic"
If ret = vbYes Then
'Replace string in virtual memory
Call WriteProcessMemory(hProcess, ByVal CalcAddress - 1, ByVal sReplaceString, Len(sReplaceString), lWritten)
'Redraw window
InvalidateRect hWin, 0, 1
End If
Exit Do
End If
End If
End If
'Increase base address for next searching cicle. Last address may overhead max Long value (Windows use 2GB memory, which is near max long value), so add Error checking
On Error GoTo Finished
lpMem = mbi.BaseAddress + mbi.RegionSize
On Error GoTo 0
Else
Exit Do
End If
Loop
Finished:
CloseHandle hProcess
End Sub
Private Sub Form_Load()
Caption = "VB-O-Matic"
Label1 = "Start application:"
Label2 = "String to find:"
Label3 = "Replace with:"
Text1 = "Calc.exe"
Text2 = "Backspace"
Text3 = "VB-O-Matic"
Command1.Caption = "&Launch It!"
End Sub
Private Function InstanceToWnd(ByVal target_pid As Long) As Long
Dim test_hwnd As Long
Dim test_pid As Long
Dim test_thread_id As Long
test_hwnd = FindWindow(ByVal 0&, ByVal 0&
Do While test_hwnd <> 0
If GetParent(test_hwnd) = 0 Then
test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
If test_pid = target_pid Then
InstanceToWnd = test_hwnd
Exit Do
End If
End If
test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
Loop
End Function
Private Function IsWindowsNT() As Boolean
Dim verinfo As OSVERSIONINFO
verinfo.dwOSVersionInfoSize = Len(verinfo)
If (GetVersionEx(verinfo)) = 0 Then Exit Function
If verinfo.dwPlatformId = 2 Then IsWindowsNT = True
End Function
Номер ответа: 13
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #13
Добавлено: 02.04.07 00:43
Несколько статеек для понимания:
http://vsokovikov.narod.ru/Msdn_api/Global_SDK/Reference_API/Functions/Fn_O/fn_openprocess.htm
http://www.xakep.ru/post/31238/default.asp?print=true
http://phys.lan.krasu.ru/servic/4.html
Номер ответа: 14
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #14
Добавлено: 02.04.07 00:43
остальное завтра
Номер ответа: 15
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #15
Добавлено: 02.04.07 01:01
Спасибо, -АлександР-, работает. Хоть и поморочено маленько