Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
1

Своя кнопка в чужом окне

16.04.2013, 17:54. Показов 4576. Ответов 24
Метки нет (Все метки)

Здравствуйте Господа!!! Хочу внедрить свою кнопку в чужой процесс , при помощи DLL , итак делаю .dll в DLL_PROCESS_ATTACH пишу так -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case DLL_PROCESS_ATTACH:
 
        if(FindWindow(NULL,"z")){
    
InitCommonControls ();
 
    hw=FindWindow(NULL,"z");
 
hButton = CreateWindow("button", "Свернуть",
                                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                75, 75, 75, 75, hw, (HMENU)BTN, 
                                ::GetModuleHandle(NULL), NULL);
 
if(hButton==0){MessageBoxA(hw,"Error","Info",MB_OK);}
 
else{MessageBoxA(hw,"Ok!!!","Info",MB_OK);}
 
}
 
        break;
кнопка создалась в чужом окне и соответственно выскочил MessageBox с надписью "ок!!!" , но вот беда , после того как я нажал в MessageBox - е ок , вместе с ним исчезает и кнопка , так вот вопрос с чего она вообще куда то делась , прикрепляю скрин до и после
0
Миниатюры
Своя кнопка в чужом окне   Своя кнопка в чужом окне  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2013, 17:54
Ответы с готовыми решениями:

Рисование в чужом окне
Дано окно чужой программы. Требуется что-то на нем нарисовать. Скажем, дырку в том месте, куда...

Жмём по кнопках в чужом окне
Мне нужно проделывать кое-какие действия с кнопкой чужого окна, а именно эмулировать нажатие левой...

Как нарисовать текст в чужом окне?

Отслеживание нажатия моей кнопки в чужом окне
Доброго времени суток прошу вашей помощи в некой задаче Вобщем есть приложение через которое я...

24
22 / 7 / 2
Регистрация: 15.10.2012
Сообщений: 33
16.04.2013, 20:52 2
возможно месседж бокс закрывается, окно З становится активным, перерисовывается, а твоя кнопка нет... она есть но не перерисовалась
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
16.04.2013, 21:09 3
А может быть потому, что DLL выгружается, а с этим становится не валидной кнопка, созданная с hInstance DLL-ки !?
Вариант с перерисовкой тут явно не при чем.
0
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
16.04.2013, 21:20  [ТС] 4
Цитата Сообщение от lazybiz Посмотреть сообщение
Вариант с перерисовкой тут явно не при чем
вот тут соглашусь , а вот с этим -

Цитата Сообщение от lazybiz Посмотреть сообщение
А может быть потому, что DLL выгружается, а с этим становится не валидной кнопка, созданная с hInstance DLL-ки !?
извени , но не согласен так как в dll есть такой код -
C++
1
2
3
case DLL_PROCESS_DETACH:
        MessageBoxW(0,(LPCWSTR)L"Detaching",(LPCWSTR)L"OK!",MB_OK);
        break;
и он не выскакивает , а вот когда закрываешь приложение вот тогда и показывается - detaching
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
16.04.2013, 21:25 5
А у тебя в DLL_PROCESS_ATTACH после успешного создания кнопки функция DllMain что возвращает?
0
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
16.04.2013, 22:02  [ТС] 6
lazybiz, возращает true
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
16.04.2013, 22:11 7
Ну тогда не знаю. Может тебе весь код DLL-ки показать!?
0
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
16.04.2013, 22:20  [ТС] 8
пожалуйста -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#define BTN 1000
#pragma comment(lib,"comctl32.lib")
#pragma once
#include <Windows.h>
#include <commctrl.h>
 
#ifndef EXTF
#define EXTF extern "C" __declspec(dllimport)
#endif
 
 
#define EXTF extern "C" __declspec(dllexport)
#include "windows.h"
 
 
    HWND hw;
 HWND hButton=0;
 
BOOL WINAPI DllMain(HINSTANCE hInstDll,DWORD fdwReason, LPVOID Res)
{
 
    switch(fdwReason)
    {
 
    case DLL_PROCESS_ATTACH:
 
 
        if(FindWindow(NULL,"z")){
    
InitCommonControls ();
 
    hw=FindWindow(NULL,"z");
 
hButton = CreateWindow("button", "Свернуть",
                                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                75, 75, 75, 75, hw, (HMENU)BTN, 
                                ::GetModuleHandle(NULL), NULL);
 
if(hButton==0){MessageBoxA(hw,"Error","Info",MB_OK);}
 
else{MessageBoxA(hw,"Ok!!!","Info",MB_OK);}
 
}
 
        break;
 
    case DLL_PROCESS_DETACH:
        MessageBoxW(0,(LPCWSTR)L"Detaching",(LPCWSTR)L"OK!",MB_OK);
        break;
 
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:     
        break;
    default:
        break;
    }
    return TRUE;
}
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
16.04.2013, 22:33 9
А если создать кнопку с hInstance чужого процесса ?
0
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
16.04.2013, 23:04  [ТС] 10
Цитата Сообщение от lazybiz Посмотреть сообщение
А если создать кнопку с hInstance чужого процесса ?
а я что делаю ?

Цитата Сообщение от Игорь с++ Посмотреть сообщение
::GetModuleHandle(NULL), NULL);
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
16.04.2013, 23:08 11
А ты её создаешь с hInstance DLL.
0
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
16.04.2013, 23:11  [ТС] 12
Цитата Сообщение от lazybiz Посмотреть сообщение
А ты её создаешь с hInstance DLL.
я её создаю с того HINSTANCE куда поселилась dll
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
16.04.2013, 23:16 13
Нет.
C++
1
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved )
Тут hinstDLL - это то же самое что и GetModuleHandle( NULL ), и это:
hinstDLL
A handle to the DLL module. The value is the base address of the DLL. The HINSTANCE of a DLL is the same as the HMODULE of the DLL, so hinstDLL can be used in calls to functions that require a module handle.
0
Maniac
Эксперт С++
1456 / 957 / 159
Регистрация: 02.01.2009
Сообщений: 2,816
Записей в блоге: 1
16.04.2013, 23:16 14
В другом потоке попробуй создать..
Вот немного по теме http://sim0n.wordpress.com/200... rom-a-dll/
0
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
16.04.2013, 23:31  [ТС] 15
lazybiz, попробуй создай dll и вызови - GetModuleFileNameA он тебе вернёт название процесса куда встроился.

ISergey, пробывал я это всё запихнуть в поток -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DWORD WINAPI ThreadProc(LPVOID Param)
{
 
if(FindWindow(NULL,"z")){
    
InitCommonControls ();
 
    hw=FindWindow(NULL,"z");
 
hButton = CreateWindow("button", "Свернуть",
                                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                75, 75, 75, 75, hw, (HMENU)BTN, 
                                ::GetModuleHandle(NULL), NULL);
 
if(hButton==0){MessageBoxA(hw,"Error","Info",MB_OK);}
 
else{MessageBoxA(hw,"Ok!!!","Info",MB_OK);}
 
}
 
return 0;
 
}
не чего не получается.
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
16.04.2013, 23:52 16
Игорь с++, с какими параметрами вызывать GetModuleFileNameA ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31187 / 20385 / 7940
Регистрация: 22.10.2011
Сообщений: 35,345
Записей в блоге: 6
17.04.2013, 01:51 17
Игорь с++, проверил твою DLL-ку (в Code::Blocks). Нормально создается кнопка, и никуда не исчезает... До закрытия приложения:
Своя кнопка в чужом окне


Что я делаю не так?
1
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
17.04.2013, 09:44  [ТС] 18
UI, до закрытие приложение которое инжектило dll ? Если да ,то почему она после закрывается , если код уже в другом приложений ? Хотя я постоянно закрывал приложение которое инжектило,надо будет проверить,тогда отпишусь.

Добавлено через 37 минут
UI, а вы какие нибудь настройки делали при создании проекта,просто я тоже сначало в code:blocks пробовал,но что то даже кнопка не появлялась.

Добавлено через 2 минуты
UI, а вы какие нибудь настройки делали при создании проекта,просто я тоже сначало в code:blocks пробовал,но что то даже кнопка не появлялась.
lazybiz, как и написанно в msdn если запускается данная функция в своём приложени,то первый параметр должен быть -NULL.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31187 / 20385 / 7940
Регистрация: 22.10.2011
Сообщений: 35,345
Записей в блоге: 6
17.04.2013, 09:49 19
Игорь с++, меня почему-то терзают смутные сомнения. Вот это всё выполнено:
Цитата Сообщение от Джеффри Рихтер
1. Выделите блок памяти в адресном пространстве удаленного процесса через VirtualAllocEx.
2. Вызвав WriteProcessMemory, скопируйте строку с полным именем файла DLL в блок памяти, выделенный в п.1.
3. Используя GetProcAddress, получите истинный адрес функции LoadLibraryA или LoadLibraryW внутри Kernel32.dll.
4. Вызвав CreateRemoteThread, создайте поток в удаленном процессе, который вызовет соответствующую функцию LoadLibrary, передав ей адрес блока памяти, выделенного в п.1.
? Если выполнено - то и после закрытия инжектирующего процесса кнопка останется на месте.
0
480 / 472 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
17.04.2013, 09:57  [ТС] 20
да с этим всё норм.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2013, 09:57

Рисование в чужом окне
Собственно, я понимаю как рисовать, мне больше интересно 2 момента: 1) Если я просто буду рисовать...

Рисование в чужом окне
всем привет как рисовать текст в чужом окне не используя своего окна и не имея его

Клик в чужом окне
Как можно реализовать множественный клик правой кнопкой мыши в чужом окне?

Нажать на кнопку в чужом окне
Добрый день, подскажите, есть ли возможность получить доступ к контролам чужой формы? Т.е. есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.