Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Gremlin
514 / 302 / 58
Регистрация: 30.07.2008
Сообщений: 607
1

Скрин чужого окна по его HANDLE

06.12.2010, 14:27. Просмотров 1778. Ответов 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 его окна
Нужно узнать имя и путь исполняемого файла, имея handle его окна. Когда используешь handle...

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

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

Закрытие чужого окна
Код: #include <windows.h> # include <vcl.h> #pragma hdrstop # include <Mmsystem.h> HWND...

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

3
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 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 / 58
Регистрация: 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
Эксперт С++
3920 / 1785 / 183
Регистрация: 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

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

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

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


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

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

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