Почитай про эту функцию из user32. VOID keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, PTR dwExtraInfo ); ( При помощи неё можно даже переключать светодиоды на клавиатуре ) и ещё про эту UINT SendInput( UINT nInputs, LPINPUT pInputs, int cbSize );
hakeem UINT SendInput ( UINT nInputs, LPINPUT pInputs, int cbSize ); nInputs - кол-во действий, которые необходимо выполнить, например как движение мышью или нажатия клавиш. (или кол-во структур в массиве. см. следующий параметр.) Если одно действие нужно выполнить - то пишешь 1. pInputs - указатель на структуру INPUT или на массив структур INPUT, где описываешь то (те) действие(я), которые нужно выполнить, такие как, движение мыши, нажатия кнопок мыши, скролла, нажатия кнопок на клаве и прочее. Там еще поидее можно выставить задержку между этими действиями, но судя по всему эта фишка не пашет. cbSize - размер структуры в байтах. А как вызвать? формируешь структуры мыши и/или клавы, где указываешь что тебе нужно сделать, описываешь структуру INPUT и вызываешь функцию SendInput. Ниче сложного. И кстати да, МСДН в этом плане рулит
beginner Понял спасибо... Я использовал keybd_event вот таким образом: invoke keybd_event,VK_SNAPSHOT,0,0,0 Был бы признателен, еслиб привели маленький пример по SendInput
hakeem Поиск по МСДН даст подробные ответы на все подобные вопросы, но он сильно жрёт трафик, так что гораздо лучше скачать или заказать MSDN или PSDK и иметь их всегда под рукой. ЗЫ: А одиночные примеры мало что проясняют - гораздо лучше подробное описание всех возможностей и нюансов применения функций.
вот еще пример с клавой Код (Text): INPUT inp[4]; memset(inp,0,sizeof(inp)); inp[0].type=INPUT_KEYBOARD; inp[0].ki.wVk=VK_CONTROL; inp[1].type=INPUT_KEYBOARD; inp[1].ki.wVk='V'; inp[2].type=INPUT_KEYBOARD; inp[2].ki.wVk='V'; inp[2].ki.dwFlags=KEYEVENTF_KEYUP; inp[3].type=INPUT_KEYBOARD; inp[3].ki.wVk=VK_CONTROL; inp[3].ki.dwFlags=KEYEVENTF_KEYUP; SendInput(4,inp,sizeof(INPUT));
Код (Text): ; пишем в буфер обмена invoke GlobalAlloc, GMEM_FIXED, szData invoke OpenClipboard, hWin invoke EmptyClipboard invoke SetClipboardData, CF_TEXT, addr sData invoke CloseClipboard ; читаем из буфера invoke OpenClipboard, hWin invoke GetClipboardData, CF_TEXT ; в eax - указатель на буфер с данными
KondraT , братан ты остановился на самом главном но как его сохранить? я симитировал нажатие кнопки print screen: Код (Text): start: invoke keybd_event,VK_SNAPSHOT,0,0,0 invoke ExitProcess, 0 end start в буфере содержится bitmap, я делаю так: Код (Text): ; читаем из буфера invoke OpenClipboard, hWin invoke GetClipboardData, CF_BITMAP ; в eax - указатель на буфер с данными ну а дальше, я в темном лесу , мне нужно либ сохранить картинку , либ показать её...
hakeem Я извиняюсь, вопрос не ко мне, но о том, как работать с битмапами, включая сохранение, есть примеры не только в мсдн, который может действительно трудно скачать и с онлайн версией которой по началу трудно разобраться, но и в короткой справке по винапи, около 4 м: http://cracklab.ru/download.php?action=get&n=NjA1 Вот несколько переработанный код из этого справочника, предназначенный для сохранения в бмп любого окна, если с ним разобраться, подобным образом можно сохранить и из буфера обмена, вышеуказанный справочник тебе в этом поможет Код (Text): void SaveScreen(HWND hWnd) { HDC hDC, CompDC; SYSTEMTIME SysTm; BITMAP bmp; PBITMAPINFO pbmi; HBITMAP hBitmap; BITMAPFILEHEADER BFHeader; WORD ClrBits; DWORD dwTmp; LPBYTE lpBits; HANDLE hFile; char FileName[22], dir[MAX_PATH]; hDC=GetDC(hWnd); CompDC=CreateCompatibleDC(hDC); hBitmap=CreateCompatibleBitmap(hDC, XSize, YSize); SelectObject(CompDC,hBitmap); BitBlt(CompDC,0,0,XSize,YSize,hDC,0,0,SRCCOPY); ReleaseDC(hWnd, hDC); GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bmp); ClrBits=(WORD)bmp.bmPlanes*bmp.bmBitsPixel; strcpy(dir,ScreenSaveDir); if(ClrBits<=16) { ClrBits=16; } else { if(ClrBits<=24) { ClrBits=24; } else { ClrBits=32; } } pbmi=(PBITMAPINFO)new BYTE [sizeof(BITMAPINFOHEADER)]; pbmi->bmiHeader.biClrUsed=0; pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); pbmi->bmiHeader.biWidth=bmp.bmWidth; pbmi->bmiHeader.biHeight=bmp.bmHeight; pbmi->bmiHeader.biPlanes=bmp.bmPlanes; pbmi->bmiHeader.biBitCount=bmp.bmBitsPixel; if(ClrBits<24) { pbmi->bmiHeader.biClrUsed=2^ClrBits; } pbmi->bmiHeader.biCompression=BI_RGB; pbmi->bmiHeader.biSizeImage=(pbmi->bmiHeader.biWidth)*pbmi->bmiHeader.biHeight*(ClrBits/8); pbmi->bmiHeader.biClrImportant=0; lpBits= (UCHAR*)VirtualAlloc(NULL, pbmi->bmiHeader.biSizeImage, MEM_TOP_DOWN | MEM_COMMIT, PAGE_READWRITE); GetDIBits(CompDC, hBitmap,0,pbmi->bmiHeader.biHeight,lpBits,pbmi,DIB_RGB_COLORS); GetLocalTime(&SysTm); sprintf(FileName,"\\%hu%02hu%02hu%02hu%02hu%02hu%03hu.bmp", SysTm.wYear,SysTm.wMonth,SysTm.wDay,SysTm.wHour,SysTm.wMinute,SysTm.wSecond,SysTm.wMilliseconds); strcat(dir,FileName); hFile=CreateFile(dir,GENERIC_READ|GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); BFHeader.bfType=0x4d42; BFHeader.bfSize=sizeof(BITMAPFILEHEADER)+pbmi->bmiHeader.biSize+pbmi->bmiHeader.biClrUsed*sizeof(RGBQUAD)+pbmi->bmiHeader.biSizeImage; BFHeader.bfReserved1=0; BFHeader.bfReserved2=0; BFHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+pbmi->bmiHeader.biSize+pbmi->bmiHeader.biClrUsed*sizeof(RGBQUAD); WriteFile(hFile, &BFHeader, sizeof(BITMAPFILEHEADER),(LPDWORD)&dwTmp,0); WriteFile(hFile, pbmi,sizeof(BITMAPINFOHEADER)+pbmi->bmiHeader.biClrUsed*sizeof(RGBQUAD),(LPDWORD)&dwTmp,0); WriteFile(hFile,lpBits,pbmi->bmiHeader.biSizeImage,&dwTmp,0); CloseHandle(hFile); DeleteDC(CompDC); DeleteObject(hBitmap); VirtualFree(lpBits, 0, MEM_RELEASE) ; delete pbmi; }