Вопрос: Внедрение в другую программу | Добавлено: 25.06.07 22:34 |
Автор вопроса: ![]() |
Допустим, есть некое приложение. Мне нужно добавить в него объект (кнопку) и привязать к нему свой код. Как, и можно ли это сделать на Visual Basic? |
Ответы | Всего ответов: 31 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ICQ: Два, потом нуль, дальше-девять-шесть-девять-семь. Вопросов: 4 Ответов: 20 |
Профиль | Цитата | #1 | Добавлено: 25.06.07 22:37 |
Просьба не оставлять ответов типа:
Можно ли МожноКак Не знаю.
|
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 25.06.07 23:03 |
Внедряешь в адресное пространство другого приложения свою DLL, получаешь hWnd нужного окна, при подсоединении DLL создаешь кнопку на этом окне, потом меняешь адрес оконной процедуры на свой, если приходящее событие — нажатие на кнопку, то выполняешь нужный код, если нет, то выполняешь оригинальную оконную процедуру, передавая ей все прежние аргументы. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ICQ: Два, потом нуль, дальше-девять-шесть-девять-семь. Вопросов: 4 Ответов: 20 |
Профиль | Цитата | #3 | Добавлено: 25.06.07 23:07 |
То есть, чтобы кнопка присутствовала в окне, нужно иметь в оперативной памяти сразу две программы ("жертва" и "охотник"![]() |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #4 | Добавлено: 26.06.07 00:04 |
вот для начала, поиздевайся над калькулятором
Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function CreateWindowEx Lib "user32" 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 Private Declare Function SetWindowPos Lib "user32" (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 Private Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const SWP_NOSIZE = &H1 Private Const SWP_NOMOVE = &H2 Private Const WS_CHILD = &H40000000 Private Const WS_VISIBLE = &H10000000 Private Const WS_CLIPCHILDREN = &H2000000 Private Const WS_CLIPSIBLINGS = &H4000000 Private Const GWL_WNDPROC = (-4) Private Sub Command1_Click() Dim yorik As Long Dim mybut1 As Long yorik = FindWindow(vbNullString, "Калькулятор" ![]() If (yorik = 0) Then Call Shell("calc.exe", vbNormalFocus) yorik = FindWindow(vbNullString, "Калькулятор" ![]() End If If yorik Then Me.Hide MsgBox "Бедный Йорик, Ща мы ему подложим кнопку!" mybut1 = CreateWindowEx(0, "BUTTON", "Йорик, Must Die", WS_CLIPCHILDREN Or WS_CLIPSIBLINGS Or WS_CHILD Or WS_VISIBLE, 2, 2, 150, 50, yorik, 0, App.hInstance, 0) Call SetWindowPos(mybut1, 0, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) Call SetWindowPos(yorik, -1, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) Call SetForegroundWindow(yorik) Else MsgBox "Йорика не видели? Ушел, сука!" End If Me.Show End Sub |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 26.06.07 00:30 |
EUGY
Код этот бесполезен, т.к. нет обработки ![]() PS Sharp имелл ввиду что можно, но не на VB6, точнее не на нем одном. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #6 | Добавлено: 26.06.07 00:50 |
Обработка - как два байта переслать
Валяю дурака дальше. Private Sub Command1_Click() Dim yorik As Long Dim mybut1 As Long yorik = FindWindow(vbNullString, "Калькулятор" ![]() If (yorik = 0) Then Call Shell("calc.exe", vbNormalFocus) yorik = FindWindow(vbNullString, "Калькулятор" ![]() End If If yorik Then Me.Hide MsgBox "Бедный Йорик, Ща мы ему подложим кнопку!" mybut1 = CreateWindowEx(0, "BUTTON", "Йорик, Must Die", WS_CLIPCHILDREN Or WS_CLIPSIBLINGS Or WS_CHILD Or WS_VISIBLE, 2, 2, 150, 50, yorik, 0, App.hInstance, 0) Call SetWindowPos(mybut1, 0, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) Call SetWindowPos(yorik, -1, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) Call SetForegroundWindow(yorik) '-------------- Call SetProp(mybut1, "GRANDMA", GetWindowLong(mybut1, GWL_WNDPROC)) SetWindowLong mybut1, GWL_WNDPROC, AddressOf win_proc Else MsgBox "Йорика не видели? Ушел, сука!" End If Me.Show End Sub '----------------в модуле Public Function win_proc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case Msg Case WM_LBUTTONUP MsgBox "qwerty" End Select win_proc = CallWindowProc(GetProp(hwnd, "GRANDMA" ![]() End Function опускаю декларации. И если этот, мною написанный маразм, кого-нибудь из новичков заставит мыслить своими мозгами, буду только рад. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #7 | Добавлено: 26.06.07 01:06 |
P.S.
To sne: Код этот бесполезен, хотя и есть обработка. С мнением Sharp я согласен на все 100. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #8 | Добавлено: 26.06.07 01:06 |
GRANDMA зачет, телефоны бабушек рулят ![]() ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 26.06.07 02:22 |
EUGY, гг, а теперь попробуй это свое чудо доделать и протестировать. Чтобы кнопка была на калькуляторе, а выполнялось действие то что ты накодировал на VB ![]() |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #10 | Добавлено: 26.06.07 03:05 |
sne, я правда не понял, что ты от меня хочешь.
В чем подначка? ![]() Этот шедевр, который ты по праву назвал чудом, кладет кнопку на калькулятор и обработка нажатия этой кнопки присутствует (выводиться MsgBox). Может ты не заметил этого? //--- У меня нет проблем с написанием-объявлением любых функций и внедрение своего кода в чужой процесс. Я лишь пытался сделать наглядный пример, а не писать статью. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 26.06.07 08:26 |
В смысле имеется видимо отладка твоего примера, который вероятно с первого раза вместе с декларациями не пустится. Сам определенно сказать не могу, т.к. не на чем сейчас проверить. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #12 | Добавлено: 26.06.07 09:02 |
Допустим, есть некое приложение. Мне нужно добавить в него объект (кнопку) и привязать к нему свой код. Как, и можно ли это сделать на Visual Basic?
Выложу это прости-господи еще раз, чуть причесав. Злобные насмешки, унижающие достоинство, приветствуются. ' SUB MAIN Option Explicit Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function CreateWindowEx Lib "user32" 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 Public Declare Function SetWindowPos Lib "user32" (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 Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 'Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long 'Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long 'Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long Public Declare Function DefWindowProc Lib "user32" Alias " ![]() Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long Public Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long Public 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 Public 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 Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Long Public Const SWP_NOSIZE = &H1 Public Const SWP_NOMOVE = &H2 Public Const WS_CHILD = &H40000000 Public Const WS_VISIBLE = &H10000000 Public Const WS_CLIPCHILDREN = &H2000000 Public Const WS_CLIPSIBLINGS = &H4000000 Public Const GWL_WNDPROC = (-4) Public Const WM_LBUTTONUP = &H202 Sub Main() Dim yorik As Long Dim mybut1 As Long yorik = FindWindow(vbNullString, "Калькулятор" ![]() If (yorik = 0) Then Call Shell("calc.exe", vbNormalFocus) yorik = FindWindow(vbNullString, "Калькулятор" ![]() End If If yorik Then mybut1 = CreateWindowEx(0, "BUTTON", "Éîðèê, Must Die", WS_CLIPCHILDREN Or WS_CLIPSIBLINGS Or WS_CHILD Or WS_VISIBLE, 2, 2, 150, 50, yorik, 0, App.hInstance, 0) Call SetWindowPos(mybut1, 0, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) Call SetWindowPos(yorik, -1, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) Call SetProp(mybut1, "GRANDMA", GetWindowLong(mybut1, GWL_WNDPROC)) Call SetWindowLong(mybut1, GWL_WNDPROC, AddressOf win_proc) Call SetForegroundWindow(yorik) Else MsgBox "Éîðèêà íå âèäåëè? Óøåë, ñóêà!" End If End Sub Public Function win_proc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case Msg Case WM_LBUTTONUP Call MessageBox(GetParent(hwnd), "Éîðèê, Must Die", "qwerty", 0) End Select win_proc = CallWindowProc(GetProp(hwnd, "GRANDMA" ![]() End Function |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 26.06.07 10:33 |
Да расслабься, никто не хотел задеть твоё достоинство. Раз ты говоришь, что работает, значит работает. Все Ok. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 26.06.07 10:48 |
Поставь на достоинство брандмаузер и не парься ![]() ![]() |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #15 | Добавлено: 26.06.07 11:31 |
Я и не напрягаюсь :-}
Мне лично вся эта писанина нах не нужна. Просто вот задал человек вопрос, и пропал. И как-то стало одиноко... Пойду за пивом. |
|