Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/30: Рейтинг темы: голосов - 30, средняя оценка - 4.83
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте Господа!!! Хочу внедрить свою кнопку в чужой процесс , при помощи 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
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32833 / 21170 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
17.04.2013, 10:18 21
Author24 — интернет-сервис помощи студентам
Если бы было "норм" - работало бы. Код в студию.
0
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
17.04.2013, 18:12  [ТС] 22
UI, вот выкладываю код программы которая инжектит и код dll (в code::blocks кнопка появилась , но и так же исчезла , но вот что странно , если не трогать MessageBox - а , то даже работает нажатие на кнопку)
код инжекта (полностью)-
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include <windows.h>
#define BYN 1111
#define BTN 0x0000012
#define BTN2 0x0000013
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
char q[1000000]={0};
char vivod[100000000]={0};
char zap[]=",";
 
int t=0;
 
HWND hListBox;
HINSTANCE hin;
 
 
char buf[10000];
char name[]="MyDll.dll";
 
BOOL SetDebugPrivileges();
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
hin=hThisInstance;
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Из ListBox в Edit",       /* Title Text */
           WS_SYSMENU, /* default window */
           0,       /* Windows decides the position */
           0,       /* where the window ends up on the screen */
           707,                 /* The programs width */
           160,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, SW_SHOW);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP hBitmap;
        PAINTSTRUCT ps;
 
        HWND Edit;
HWND hButton;
        HWND hwn;
        HWND hw=GetDesktopWindow();
  
        HDC hdc;
 HWND hwN;
 
 static int wmId, wmEvent;
static int number;
static int number2;
static int number3;
static char q2[100000]={0};
 
 
switch (message)                  /* handle the messages */
    {
case WM_CREATE:
                 
Edit = CreateWindowEx( WS_EX_CLIENTEDGE, "Edit", "",
                        ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE,
                        0, 100, 700, 25,hwnd, (HMENU)BTN, hin, NULL );
 
     hListBox=CreateWindow("LISTBOX","",WS_CHILD|WS_VISIBLE|LBS_NOTIFY|
    WS_VSCROLL,0,0,700,80,hwnd,(HMENU)1111,hin,NULL);
    
hw=GetWindow(hw,GW_CHILD);
GetWindowTextA(hw,q,100);
number2=strlen(q);
 
if(number2!=0){
SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)q);
}
 
 
for(;;){
        
hw=GetWindow(hw,GW_HWNDNEXT);
if(hw==FALSE){
              break;}
GetWindowTextA(hw,q,1000000);
number2=strlen(q);
if(number2!=0){
SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)q);
}
        }
 
 
case WM_CTLCOLOREDIT:
  SetBkMode((HDC)wParam,TRANSPARENT);
            SetTextColor( (HDC)wParam, RGB( 0, 255, 0 ) );
            return (LRESULT)CreateSolidBrush(RGB(0,0,0));
break;
     break;
 
 
 
case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
 
        switch (wmId)
        {
                   case 1111:
                      if (wmEvent == LBN_DBLCLK) 
                      {
                       
 number=SendMessage(hListBox,LB_GETCURSEL,0,wParam); 
 
  
  SendMessage(hListBox,LB_GETTEXT,(WPARAM)number,(LPARAM)q);
 
  hwn=hwnd;
  hwn=GetWindow(hwn,GW_CHILD);
    SetWindowText (hwn, q);
 
SetDebugPrivileges();
     
    HANDLE hProc; HANDLE hMMF,EventServ,EventClient;
    HANDLE hTR;
    LPVOID cmtmem;PBYTE pView;            
 
    DWORD pid ,f;
    
HWND h;
 
h=FindWindowA(NULL,q);
 
GetWindowThreadProcessId(h, &pid);
 
 
    hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
 
     cmtmem=VirtualAllocEx(hProc,NULL,strlen(name)+1,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
 
    hMMF=CreateFileMappingA(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,"InjecterMMF");
    pView=(PBYTE)MapViewOfFile(hMMF,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
    EventServ=CreateEventA(NULL,FALSE,FALSE,"ServEvent");
    EventClient=CreateEventA(NULL,FALSE,FALSE,"CliEvent");
 
    if(WriteProcessMemory(hProc,cmtmem,name,strlen(name)+1,NULL))
    {
                                                                 
 
                                                                 
        LPTHREAD_START_ROUTINE pfnLoad=(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32.dll"),"LoadLibraryA");
 
         hTR=CreateRemoteThread(hProc,NULL,0,pfnLoad,cmtmem,0,NULL);
 
    }
                                      }
                      break;
 }
 
        break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
 
BOOL SetDebugPrivileges()
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
    HANDLE hToken;
 
    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_READ|TOKEN_ADJUST_PRIVILEGES,&hToken))
        {return FALSE;}
 
    if(!LookupPrivilegeValueA(NULL,"SeDebugPrivilege",&luid))
        {CloseHandle(hToken);return FALSE;}
 
    tp.PrivilegeCount=1;
    tp.Privileges[0].Luid=luid;
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
 
    if(!AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL))
        {CloseHandle(hToken);return FALSE;}
    
    CloseHandle(hToken);
    return TRUE;
}
код dll-
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "main.h"
#define BTN 1000
#define BTN2 1001
#include <commctrl.h>
// a sample exported function
/*
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
*/
 
HWND hw;
 HWND hButton=0;
 HWND Edit=0;
WNDPROC DefButtonProc;
 
 
LRESULT CALLBACK DefButtonProcNew(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
static char Name[100];
 
    switch(message)
    {
 
case WM_COMMAND:
 
            switch (LOWORD(wParam))
            {
 
                case BTN:
                    GetWindowTextA(Edit,Name,100);
            MessageBoxA(0,Name,"info",MB_OK);
break;
            }
            break;
 
    }
    return((LRESULT)CallWindowProc((WNDPROC)DefButtonProc,hwnd,message,wParam,lParam));
}
 
 
 
 
 
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    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);
 
 
Edit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "Поле для ввода",
                                  ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE,
                                  10, 10, 270, 25,hw, (HMENU)BTN2, ::GetModuleHandle(NULL), NULL);
 
 
 
if(hButton==0){MessageBoxA(0,"Error","Info",MB_OK);}
 
else{
 
 
    DefButtonProc = (WNDPROC)GetWindowLongPtr(hw,GWLP_WNDPROC);
            SetWindowLongPtr(hw,GWLP_WNDPROC,(LPARAM)DefButtonProcNew);
 
        MessageBoxA(0,"Ok!!!","Info",MB_OK);}
 
 
}
 
            break;
 
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
 
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
 
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
Добавлено через 4 часа 31 минуту
что самое интересное я сейчас создал приложение которое находит окно и делает в нём кнопку (без всяких .dll и естественно без обработчиков этой кнопки) , так вот когда закрываешь это окно , то кнопка в чужом процессе тоже исчезает . Вот как БЛИН!!!
2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32833 / 21170 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
17.04.2013, 22:10 23
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Цитата Сообщение от Игорь с++ Посмотреть сообщение
но и так же исчезла
Не, а чего ты ожидал-то? Смотри: ты вызываешь CreateRemoteThread, то есть создаешь поток. В котором создаются дополнительные контролы, и который существует ровно до тех пор, пока ты не нажмешь кнопку на MessageBox-е. Нажал кнопку - поток уничтожился, всё, что в нем создано - разрушилось. Я бы сделал по-другому: подменил бы оконную процедуру hw, и выслал ему уникальное сообщение, по которому там и создались бы эти 2 контрола. Смотри:

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#define BTN 1000
#define BTN2 1001
 
#include "main.h"
#include <commctrl.h>
 
HWND hw;
HWND hButton = 0;
HWND Edit = 0;
WNDPROC OldWndProc;
UINT WM_USER_UNIQUE;
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if(uMsg == WM_USER_UNIQUE)
    {
        hButton = CreateWindow("button", "Show",
                               WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                               75, 75, 75, 75, hw, (HMENU)BTN,
                               ::GetModuleHandle(NULL), NULL);
        Edit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "Edit field",
                              ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE,
                              10, 10, 270, 25,hw, (HMENU)BTN2, ::GetModuleHandle(NULL), NULL);
        if(!hButton)
        {
            MessageBoxA(0,"Error","Info",MB_OK);
        }
        else
        {
            MessageBoxA(0,"Ok!!!","Info",MB_OK);
        }
        return 0;
    }
    else if(uMsg == WM_COMMAND)
    {
        static char Name[100];
        switch (LOWORD(wParam))
        {
            case BTN:
                GetWindowTextA(Edit, Name, 100);
                MessageBoxA(0, Name, "info", MB_OK);
        }
    }
    return CallWindowProc(OldWndProc, hwnd, uMsg, wParam, lParam);
}
 
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            if((hw = FindWindow(NULL,"Zed")) != NULL)
            {
                WM_USER_UNIQUE = RegisterWindowMessage(TEXT("UI_ForCyberForum"));
                OldWndProc = (WNDPROC) SetWindowLongPtr(hw, GWLP_WNDPROC, (LONG_PTR) WndProc);
                PostMessage(hw, WM_USER_UNIQUE, 0, 0); // Создать контролы в окне
            }
            break;
 
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
 
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
 
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // successful
}
, и ничего пропадать не станет...
2
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
17.04.2013, 22:25  [ТС] 24
UI, Спасибо большое вам , сейчас испробую (у самого уже нет вообще мыслей,мозги кипят),СПАСИБО ОГРОМНОЕ, но если , что отпишусь

Добавлено через 8 минут
Спасибо !!! Всё понял . Ещё раз огромное спасибо за такой специфичиский способ !!!
0
1 / 1 / 0
Регистрация: 06.12.2013
Сообщений: 76
22.05.2016, 13:40 25
если не трудно скинь исходник, чот пытаюсь сделать тож самое не чего не выходит, в заранее спасибо

Добавлено через 1 час 23 минуты
все разобрался, ток чот в приложение в которое я внедряю длл оно на d3d сделано, кнопка видна ток когда я примерно нажимаю на то место где она должна быть , в другом любом приложение так то работает, очень жаль что не подошло это решение для меня
0
22.05.2016, 13:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2016, 13:40
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru