Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Gremlin
514 / 302 / 26
Регистрация: 30.07.2008
Сообщений: 607
#1

Скрин чужого окна по его HANDLE - C++ Builder

06.12.2010, 14:27. Просмотров 1744. Ответов 3
Метки нет (Все метки)

Прошу помощи\совета

что то я никак не могу получить скрин окна по HANDLE
ниже приведен код, он делает скрин и выводит в Image1
но он работает некорректно только 1 раз, а чтоб второй раз
сработал нужно свернуть и развернуть форму проекта (вообщем лабуда получается)

Я точно знаю что делаю что то не так но понять не могу что

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    AnsiString h = "001B06B0";
 
    HDC hdc = GetDC((HWND)(StrToInt("0x" + h)));
    if(hdc)
    {
        TRect *r = new TRect;
        GetWindowRect((HWND)(StrToInt("0x" + h)), r);
        Graphics::TBitmap* bmp = new Graphics::TBitmap();
        bmp->Width = r->Width();
        bmp->Height = r->Height();
        BitBlt(Image1->Canvas->Handle, 0, 0, r->Width(), r->Width(), hdc, 0, 0, SRCCOPY);
 
        delete r;
        r = NULL;
        delete bmp;
        bmp = NULL;
    }
    ReleaseDC(NULL, hdc);
    DeleteDC(hdc);
Добавлено через 11 часов 22 минуты
Разобрался, надо было добавить Image2->Refresh();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2010, 14:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Скрин чужого окна по его HANDLE (C++ Builder):

Нужно узнать имя и путь исполняемого файла, имея handle его окна - C++ Builder
Нужно узнать имя и путь исполняемого файла, имея handle его окна. Когда используешь handle текущего окна - всё работает: long...

найти хендл чужого окна зная его атом - C++
как можно найти хендл чужого окна по атому??

поиск Handle окна, зная ControlId окна - C++
вопрос по сабжу

Закрытие чужого окна - C++ Builder
Код: #include <windows.h> # include <vcl.h> #pragma hdrstop # include <Mmsystem.h> HWND MainWnd; ; LRESULT CALLBACK...

Цвет пикселя чужого окна - C++ Builder
Пытаюсь получить цвет пикселя чужого окна даже если оно перекрыто... Написал простой код для получение пикселя под мышкой в определенном...

считать текст с чужого окна - C++ Builder
Доброго времени суток! Пишу тут одну программку шпору, но в ходе написания столкнулся со след. проблемами: //---------------- { ...

3
MikeSoft
Эксперт С++
3916 / 1781 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
06.12.2010, 14:34 #2
Gremlin, всё несколько проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HWND hWnd = FindWindow(NULL, L"Безымянный - Блокнот");
if (hWnd) {
  TRect Rect;
  GetWindowRect(hWnd,&Rect);
  HDC DC = GetWindowDC(hWnd);
  if (DC) {
    Graphics::TBitmap *BMP = new Graphics::TBitmap();
    BMP->Width = Rect.Width();
    BMP->Height = Rect.Height();
    BitBlt(BMP->Canvas->Handle,0,0,Rect.Width(),Rect.Height(),DC,0,0,SRCCOPY);
    Image1->Picture->Bitmap->Assign(BMP);
    ReleaseDC(hWnd,DC);
    delete BMP;
    BMP = NULL;
  }
}
1
Gremlin
514 / 302 / 26
Регистрация: 30.07.2008
Сообщений: 607
06.12.2010, 16:17  [ТС] #3
Спасибо, просто я беру HWND одной Flash в браузере
и ищу картинку на этом скрине, потом кликаю мышкой
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
//---------------------------------------------------------------------------
void MouseLeftClick(HANDLE h, int x, int y)
{
    if(IsWindow(h))
    {
        Application->ProcessMessages();
        Sleep(100);
        Application->ProcessMessages();
        SendMessage(h, WM_LBUTTONDOWN, NULL, MAKELPARAM(x, y));
        SendMessage(h, WM_LBUTTONUP,   NULL, MAKELPARAM(x, y));
        Application->ProcessMessages();
        Sleep(250);
        Application->ProcessMessages();
        SendMessage(h, WM_LBUTTONDOWN, NULL, MAKELPARAM(x, y));
        SendMessage(h, WM_LBUTTONUP,   NULL, MAKELPARAM(x, y));
        Application->ProcessMessages();
        Sleep(100);
        Application->ProcessMessages();
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(Timer1->Enabled == false)
    {
        //Timer1->Interval = ((CSpinEdit1->Text.ToInt() * 1000) * 60) + 10000;
        timex = CSpinEdit1->Text.ToInt() * 1000 * 60 / 1000;
        Timer1->Enabled = true;
        Button1->Caption = "Stop";
        Button2->Enabled = false;
        CheckBox1->Checked = false;
        CheckBox1->Enabled = false;
        UnregisterHotKey(Application->Handle, 100);
        Edit1->Enabled = false;
        CSpinEdit1->Enabled = false;
        progress = true;
    }
    else
    {
        Timer1->Enabled = false;
        Button1->Caption = "Start";
        Button2->Enabled = true;
        Edit1->Enabled = true;
        CSpinEdit1->Enabled = true;
        CheckBox1->Enabled = true;
    }
}
//---------------------------------------------------------------------------
void WJ_FindImage(TImage *small, TColor small_transparent, TImage *big, TStrings *out_position)
{
    //int deltaTime = GetTickCount();
    bool good = true;
    for(int y = 0; y < big->Height - small->Height; y++) // двигаемся по Y
    {
        for(int x = 0; x < big->Width - small->Width; x++) // двигаемся по X
        {
            good = true;
            for(int miniy = 0; miniy < small->Height; miniy++)
            {
                for(int minix = 0; minix < small->Width; minix++)
                {
                    if(big->Canvas->Pixels[x + minix][y + miniy] == small->Canvas->Pixels[minix][miniy])
                     /*   || small->Canvas->Pixels[minix][miniy] == small_transparent)   */
                    {
                        good = true;
                    }
                    else
                    {
                        good = false;
                        minix = small->Width;
                        miniy = small->Height;
                    }
                }
            }
            if(good)
            {
                out_position->Add(AnsiString(x) + ";" + AnsiString(y));
                x = x + small->Width; // зачем лишнее проверять
            }
        }
    }
    /*
    out_position->Add("========");
    out_position->Add(IntToStr(big->Height * big->Width) + " px");
    out_position->Add(IntToStr(GetTickCount() - deltaTime) + " Msec");
    */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
    AnsiString h = Edit1->Text;
    HWND hWnd = (HWND)(StrToInt("0x" + h));
    if(hWnd)
    {
        TRect Rect;
        GetWindowRect(hWnd,&Rect);
        HDC DC = GetWindowDC(hWnd);
        if(DC)
        {
            Graphics::TBitmap *BMP = new Graphics::TBitmap();
            BMP->Width = Rect.Width();
            BMP->Height = Rect.Height();
            BitBlt(BMP->Canvas->Handle, 0, 0, Rect.Width(), Rect.Height(), DC, 0, 0, SRCCOPY);
            Image1->Picture->Bitmap->Assign(BMP);
            ReleaseDC(hWnd,DC);
            delete BMP;
            BMP = NULL;
        }
    }
 
    // предварительно загруженные картинки
    Image2->Width = Image2->Picture->Width;
    Image2->Height = Image2->Picture->Height;
 
    Image3->Width = Image3->Picture->Width;
    Image3->Height = Image3->Picture->Height;
 
    Image4->Width = Image4->Picture->Width;
    Image4->Height = Image4->Picture->Height;
 
    TStringList *list = new TStringList;
    WJ_FindImage(Image2, TColor(0), Image1, list); // ищу, и получаю позиции
    WJ_FindImage(Image3, TColor(0), Image1, list);
    WJ_FindImage(Image4, TColor(0), Image1, list);
 
    AnsiString tmp;
    int x;
    int y;
 
    if(list->Count > 0)
    {
        for(int i = 0; i < list->Count; i++)
        {
            tmp = list->Strings[i];
            if(tmp.Length() > 2)
            {
                x = tmp.SubString(1, tmp.Pos(";") - 1).ToInt();
                y = tmp.SubString(tmp.Pos(";") + 1, tmp.Length()).ToInt();
                MouseLeftClickX((HWND)(StrToInt("0x" + Form1->Edit1->Text)), x, y);
            }
        }
        //ShowMessage(list->Text);
    }
 
    delete list;
    list = NULL;
}
//---------------------------------------------------------------------------
1
MikeSoft
Эксперт С++
3916 / 1781 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
06.12.2010, 16:21 #4
Gremlin, теперь ясно, откуда преобразования с INT -> HWND -> HDC.
Но я имел в виду то, что в изначальном коде не использовался созданный объект bmp.
И при блиттинге была дважды передана ширина полученного прямоугольника окна:
C++
1
BitBlt(Image1->Canvas->Handle, 0, 0, r->Width(), r->Width(), hdc, 0, 0, SRCCOPY);
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2010, 16:21
Привет! Вот еще темы с ответами:

Изменение заголовка чужого окна - C++ Builder
Добрый день Уважаемые товарищи программисты! Подскажите по такому вопросу зная хендл окна и заголовок окна можно какнибудь изменить...

Узнать размер рамки чужого окна - C++ Builder
Нужно узнать размер рамки чужого окна...

Кнопка: получить текст из эдит чужого окна - C++ Builder
Нужно нажать кнопку и взять текст едита чужого окна. С кнопкой я допустим разобрался HWND wnd, cwnd; wnd = FindWindow(NULL, &quot;имя...

Получить HANDLE окна CS-Source (и обезобразить игру) - C++ Builder
Приветствую! Хочу поиздеваться над другом, который не хочет выходить из дома из за CS :cry: :D Алгоритм: Если процесс &quot;hl2&quot; запущен...


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

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

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