Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
517 / 305 / 58
Регистрация: 30.07.2008
Сообщений: 607
1

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

06.12.2010, 14:27. Просмотров 2119. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2010, 14:27
Ответы с готовыми решениями:

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

Скрин чужого окна по его дексриптору
Здравствуйте! как можно сделать скрин чужого окна, если известен его дескриптор //... HWND h1;...

Handle чужого окна
Всем привет. Проблема в следующем: Есть окно посторонней программы, на ней расположено 2 поля для...

Захват дескриптора (handle) чужого окна
Можно ли из моей программы управлять окном которое создано другим приложением (закрывать,...

3
Эксперт С++
3936 / 1801 / 184
Регистрация: 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
517 / 305 / 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
Эксперт С++
3936 / 1801 / 184
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2010, 16:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Изменить стиль окна, зная его handle?
Можно ли с помощью Winapi функций изменить стиль окна, зная handle этого окна? например послав...

Можно ли запретить запуск окна, зная его Handle
Собственно вот и вопрос да и еще если можно вообще запретить запуск этой проги или её хранение, или...

Как взять текст из окна, зная его Handle?
К примеру я знаю хэндл (hWnd) текстового окна в любой запущенной программе. Как мне взять из неё...

Как зная дескриптор чужого окна сделать его неактивным?
Подскажите пожалуйста, как зная дескриптор чужого окна сделать его неактивным (невосприимчивым к...


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

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

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