Daten aus Clipboard speichern
-
Hi ist es irgendwie möglich die Daten aus dem Clipboard in einer Datei zu speichern, so das ich eine Bild Datei mit dem Inhalt des Snapshots bekomme ?
#include <windows> void SimulateInpute ( int ); int main(int argc, char* argv[]) { SimulateInpute ( VK_SNAPSHOT ); system("PAUSE"); } void SimulateInpute( int key ) { KEYBDINPUT ki; UINT nInputs = 1; INPUT in; int cbSize ; in.type=INPUT_KEYBOARD; in.ki.wVk = key; in.ki.dwFlags = KEYEVENTF_EXTENDEDKEY ; SendInput ( nInputs, &in, sizeof(in) ); in.type=INPUT_KEYBOARD; in.ki.wVk = key; in.ki.dwFlags = KEYEVENTF_KEYUP; ; SendInput ( nInputs, &in, sizeof(in) ); }
-
Hey, funktioniert VK_SNAPSHOT bei dir? Habs noch nicht mit KEYEVENTF_EXTENDEDKEY probiert. Mit keybd_event gings bei mir, mit SendInput() jedoch nicht.
Und nun zu deinem Problem, da hab ich ein Snippet übrig (Keine Überprüfungen, so wie immer mal wieder mit mir
)
// Nur 'n Helferlein void GetEncoderClsid(const wchar_t* format, CLSID* clsid) { unsigned int numEncoders = 0; unsigned int encoderSize = 0; Gdiplus::GetImageEncodersSize(&numEncoders, &encoderSize); Gdiplus::ImageCodecInfo* imageCodecInfo = reinterpret_cast<Gdiplus::ImageCodecInfo*>(new char[encoderSize]); Gdiplus::GetImageEncoders(numEncoders, encoderSize, imageCodecInfo); for(unsigned int i = 0; i < numEncoders; ++i) { if(!wcscmp(imageCodecInfo[i].MimeType, format)) { *clsid = imageCodecInfo[i].Clsid; break; } } delete[] imageCodecInfo; } // Per GDI+ gleich als JPG speichern { OpenClipboard(0); HBITMAP b = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, 0); Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(b, 0); DeleteObject(b); CLSID jpgClsid; GetEncoderClsid(L"image/jpeg", &jpgClsid); Gdiplus::EncoderParameters encoderParameters; unsigned long quality = 100; // max encoderParameters.Count = 1 ; encoderParameters.Parameter[0].NumberOfValues = 1; encoderParameters.Parameter[0].Guid = Gdiplus::EncoderQuality; encoderParameters.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; encoderParameters.Parameter[0].Value = &quality; bitmap->Save(L"test.jpg", &jpgClsid, &encoderParameters); delete bitmap; }
-
Ja SendInput funktioniert bei mir, dein Code konnte ich noch nicht testen weil ich erst GDI+ runterladen muss.
Das mach ich mal morgen oder vielleicht heute noch.
Falls du GDI+ installiert hast kannstes es ja mal bei dir testen und berichten ob es funktionier hat mit dem Snapshot speichern. ^^
-
Klar funktioniert es. Gebe dir doch keinen ungetesteten Snippet
GDI+ runterladen? Mit was arbeitest du? (OS/IDE)
In Visual Studio einfach #include <gdiplus.h> und #pragma comment(lib, "gdiplus.lib") schreiben.
-
Erstmal danke für den Snippet unter Visual Studios funktioniert alles.
Nur mein RAD Studios 2007 das will nicht so recht ...
Da hatte ich sowieso einige Probleme das zum laufen zu bekommen.
Ich habe mal zum test ein Fenster erstellt und eine Linie gezeichnet sowie es hier beschrieben ist: http://www.leunen.com/cbuilder/gdiplus.htmlDas Funktionierte auch bei mir, diese Warnung
[C++ Warnung] GdiplusHeaders.h(582): W8022 'Bitmap::Clone(const Rect &,int)' verbirgt virtuelle Funktion 'Image::Clone()' krieg ich auch irgendwie nicht weg.[C++ Warnung] GdiplusHeaders.h(582): W8022 'Bitmap::Clone(const Rect &,int)' verbirgt virtuelle Funktion 'Image::Clone()'
[Linker Fehler] Unresolved external '_EncoderQuality' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\USER\DESKTOP\GDI\UNIT1.OBJMuss ich für _EncoderQuality noch irgendwas einbinden ?
Ich habe die gdiplus.lib zu meinem Projekt hinzugefügt.
Hat wer eine Idee wie man das richtig unter RAD Studios 2007 zum laufen bekomme kann ?#define STRICT #include <windows.h> #include <algorithm> using std::min; using std::max; #include <gdiplus.h> using namespace Gdiplus; void SimulateInpute( int key ); void GetEncoderClsid(const wchar_t* format, CLSID* clsid); int main(int argc, char* argv[]) { SimulateInpute( VK_SNAPSHOT ); OpenClipboard(0); HBITMAP b = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(b, 0); DeleteObject(b); CLSID jpgClsid; GetEncoderClsid(L"image/jpeg", &jpgClsid); Gdiplus::EncoderParameters encoderParameters; unsigned long quality = 100; // max encoderParameters.Count = 1 ; encoderParameters.Parameter[0].NumberOfValues = 1; encoderParameters.Parameter[0].Guid = Gdiplus::EncoderQuality; encoderParameters.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; encoderParameters.Parameter[0].Value = &quality; bitmap->Save(L"test.jpg", &jpgClsid, &encoderParameters); delete bitmap; return 0; } //--------------------------------------------------------------------------- void SimulateInpute( int key ) { KEYBDINPUT ki; UINT nInputs = 1; INPUT in; int cbSize ; in.type=INPUT_KEYBOARD; in.ki.wVk = key; in.ki.dwFlags = KEYEVENTF_EXTENDEDKEY ; SendInput ( nInputs, &in, sizeof(in) ); in.type=INPUT_KEYBOARD; in.ki.wVk = key; in.ki.dwFlags = KEYEVENTF_KEYUP; ; SendInput ( nInputs, &in, sizeof(in) ); } void GetEncoderClsid(const wchar_t* format, CLSID* clsid) { unsigned int numEncoders = 0; unsigned int encoderSize = 0; Gdiplus::GetImageEncodersSize(&numEncoders, &encoderSize); Gdiplus::ImageCodecInfo* imageCodecInfo = reinterpret_cast<Gdiplus::ImageCodecInfo*>(new char[encoderSize]); Gdiplus::GetImageEncoders(numEncoders, encoderSize, imageCodecInfo); for(unsigned int i = 0; i < numEncoders; ++i) { if(!wcscmp(imageCodecInfo[i].MimeType, format)) { *clsid = imageCodecInfo[i].Clsid; break; } } delete[] imageCodecInfo; }
-
http://lmgtfy.com/?q="Unresolved+external+'_EncoderQuality'"
BAM http://www.c-plusplus.net/forum/90496
BAM http://support.microsoft.com/kb/130869/en-us
-
Ty für die Links jetzt funktioniert.
Ich poste mal die Lösung vielleicht hilft es wem anderes auch nochmal.
#define STRICT #include <windows.h> #include <algorithm> using std::min; using std::max; #include <initguid.H> #include <gdiplus.h> using namespace Gdiplus; void SimulateInput( int key ); void GetEncoderClsid(const wchar_t* format, CLSID* clsid); int main(int argc, char* argv[]) { SimulateInput( VK_SNAPSHOT ); GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); OpenClipboard(0); HBITMAP b = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(b, 0); DeleteObject(b); CLSID jpgClsid; GetEncoderClsid(L"image/jpeg", &jpgClsid); Gdiplus::EncoderParameters encoderParameters; unsigned long quality = 100; // max encoderParameters.Count = 1 ; encoderParameters.Parameter[0].NumberOfValues = 1; encoderParameters.Parameter[0].Guid = Gdiplus::EncoderQuality; encoderParameters.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; encoderParameters.Parameter[0].Value = &quality; bitmap->Save(L"test.jpg", &jpgClsid, &encoderParameters); delete bitmap; Gdiplus::GdiplusShutdown(gdiplusToken); return 0; } //--------------------------------------------------------------------------- void SimulateInput( int key ) { KEYBDINPUT ki; UINT nInputs = 1; INPUT in; int cbSize ; in.type=INPUT_KEYBOARD; in.ki.wVk = key; in.ki.dwFlags = KEYEVENTF_EXTENDEDKEY ; SendInput ( nInputs, &in, sizeof(in) ); in.type=INPUT_KEYBOARD; in.ki.wVk = key; in.ki.dwFlags = KEYEVENTF_KEYUP; ; SendInput ( nInputs, &in, sizeof(in) ); } void GetEncoderClsid(const wchar_t* format, CLSID* clsid) { unsigned int numEncoders = 0; unsigned int encoderSize = 0; Gdiplus::GetImageEncodersSize(&numEncoders, &encoderSize); Gdiplus::ImageCodecInfo* imageCodecInfo = reinterpret_cast<Gdiplus::ImageCodecInfo*>(new char[encoderSize]); Gdiplus::GetImageEncoders(numEncoders, encoderSize, imageCodecInfo); for(unsigned int i = 0; i < numEncoders; ++i) { if(!wcscmp(imageCodecInfo[i].MimeType, format)) { *clsid = imageCodecInfo[i].Clsid; break; } } delete[] imageCodecInfo; }
-
Hab noch was vergessen.
Und die gdiplus.lib zum Projekt hinzufügen nicht vergessen.