Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2009, 16:59   #1
andreyasu
 
Регистрация: 05.06.2009
Сообщений: 5
По умолчанию Проблема с динамической работой с изображением на экране

Есть такая проблема , пишу программу которая динамически каждые три секунды должна брать изображение с экрана компьютера (где она запущенна в свернутом режиме) и анализировать это изображение уже внутри себя , я решил так , программа через winapi щелкает скриншот(просто тупо инициирует нажатие кнопочки принтскрин) в буффер винды и потом с буффера (пишу на си++) кидает в себя как объект класса рисунок - дальше уже анализ - так вот проблема в том что не знаю как перекинуть картинку из буфера винды в объект программы на си , или может кто то знает более оптимальный путь получения изображения с экрана?
Помогите плиииз
andreyasu вне форума Ответить с цитированием
Старый 06.06.2009, 00:56   #2
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Ну если

PHP код:
//чтение изображения из буфера обмена
if ( OpenClipboard() )//открываем буфер обмена
{
   
//извлекаем данные из буфера обмена
   
HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
   
CBitmap bm CBitmap::FromHandle(handle);

   
//отображаем данные из буфера
   
BITMAP bit
   
bm->GetBitmap(&bit);
   
CClientDC cdc(this);
   
CDC dc;
   
dc.CreateCompatibleDC(&cdc);
   
dc.SelectObject(bm);
   
cdc.BitBlt(00bit.bmWidthbit.bmHeight, &dc00SRCCOPY);

   
CloseClipboard();//закрываем буфер обмена

А если вы пишете не только с использованием WinApi, то у стандартной картинки должен быть метод PasteFromclipboard;

Вообще же, мудрёный метод состоит в том, чтобы унаследовать от класса Потока класс буфера обмена:

PHP код:
class ClipboardStream :public Stream {
    private:
        
DWORD FMemory;
        
long int FSizeFPosition;
        
DWORD FFormat;
    public:
    
ClipboardStream(DWORD fmt);
    ~
ClipboardStream();

    
long int Read( * Bufferlong int Count);
    
long int Write( * Bufferlong int Count);
    
long int Seek(long int OffsetDWORD Origin);

}

ClipboardStream :: ClipboardStream(DWORD fmt)
{
    
FFormat fmt;
    
OpenClipboard(0);
    
HANDLE FHandle GetClipboardData(FFormat);
    
FSize GlobalSize(FHandle);
    
FMemory AllocMem(FSize);
    * 
tmp GlobalLock(FHandle);
    
MoveMemory(FMemorytmpFSize);
    
GlobalUnlock(FHandle);
    
FPosition 0;
    
CloseClipboard;      
}

long int ClipboardStream :: Read( * Bufferlong int Count)
{
  if (
FPosition Count FSize)
        
long int Res FSize FPosition;
  else
        
Res Count;
  
MoveMemory(*BufferFMemory FPositionRes);
  
FPosition += Res;
  return 
Res
}

long int ClipboardStream :: Write( * Bufferlong int Count)
{
///////
}

long int ClipboardStream :: Seek(long int OffsetDWORD Origin);
{
    switch (
Origin)    {
        case 
FPosition Offset;
        case 
Inc(FPositionOffset);
        case 
FPosition FSize Offset;
    }
    return 
FPosition;


Последний раз редактировалось BaronTreep; 06.06.2009 в 01:18.
BaronTreep вне форума Ответить с цитированием
Старый 06.06.2009, 16:43   #3
andreyasu
 
Регистрация: 05.06.2009
Сообщений: 5
По умолчанию

Огромное спасибо....
andreyasu вне форума Ответить с цитированием
Старый 15.06.2009, 21:44   #4
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Код:
HBITMAP ScreenShot()
{
	int sx = GetSystemMetrics(SM_CXSCREEN), sy = GetSystemMetrics(SM_CYSCREEN);
	hDC = GetDC(GetDesktopWindow());
	HDC MyHDC = CreateCompatibleDC(hDC);
	HBITMAP hBMP = CreateCompatibleBitmap(hDC, sx, sy);
	SelectObject(MyHDC, hBMP);
	LOGBRUSH MyBrush;
	MyBrush.lbStyle = BS_SOLID;
	MyBrush.lbColor = 0xFF0000;
	HBRUSH hBrush = CreateBrushIndirect(&MyBrush);
	RECT MyRect = {0, 0, sx, sy};
	FillRect(MyHDC, &MyRect, hBrush);

	BitBlt(MyHDC, 0, 0, sx, sy, hDC, 0, 0, SRCCOPY);
	return hBMP;
}
lennon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с работой с файлами (Паскаль) ReaktiV Помощь студентам 27 09.11.2008 10:30
Проблема с работой програм на компах без С++ Bitrayder Общие вопросы C/C++ 2 02.03.2008 01:09
Работа с изображением Artem PHP 4 20.10.2007 15:56