Screenshot erstellen (war: Sch***** tastatur)



  • hi
    Hab an meiner tastatur kein knopf um screenshots zu machen (Der Druck Knopf)
    also mach ich mir ma nen programm,
    1. frage: wie heisst der knopf??
    2. Frage: wie bau ich ihn ein
    3. Frage: geht das überhaupt?

    danke im voraus!

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!



  • majin schrieb:

    hi
    Hab an meiner tastatur kein knopf um screenshots zu machen (Der Druck Knopf)
    also mach ich mir ma nen programm,
    1. frage: wie heisst der knopf??
    2. Frage: wie bau ich ihn ein
    3. Frage: geht das überhaupt?
    danke im voraus!

    hab ne multimedia-tatatur, also so eine mit zusatzknöpfen, umd webbrowser, taschenrechner und dergl aufzurufen. da hab ich einen von genommen für screenshots.

    ansonsten mäßte es klappen, eine verknüpfung aufs screenshot-prog ins startmenu zu machen und mit rechter maustaste/eigenschaften/tastenkombination eine tastenkombination zuzuweisen.

    code ist vermutlich nicht lauffähig, hab keinen richtigen filename-hochzähler. würde mich freuen, falls du was nachrüstest, deine erweiterungen zu sehen.

    #define _WIN32_WINNT _NT5
    
    #include <windows.h>
    
    HANDLE CreateUniqueFile(LPCSTR prefix,LPCSTR postfix,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile){
    	char path[MAX_PATH];
    	char* pathEnd=path+strlen(prefix);
    	strcpy(path,prefix);
    	WIN32_FIND_DATA ffd;
    	HANDLE hFF=FindFirstFile(path,&ffd);
    	return NULL;
    }
    
    int DC2Bitmap(HDC hdc,int left,int top,int width,int height,char *filename){
    	HDC hdc2=CreateCompatibleDC(hdc);
    
    	BITMAPINFO bi;
    
    	BITMAPINFOHEADER& bmih=bi.bmiHeader;
    	ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER));
    	bmih.biSize=sizeof(BITMAPINFOHEADER);
    	bmih.biHeight=height;
    	bmih.biWidth=width;
    	bmih.biPlanes=1;
    	bmih.biBitCount=24;
    	bmih.biCompression=BI_RGB;
    	bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
    	bmih.biXPelsPerMeter = 0;
    	bmih.biYPelsPerMeter = 0;
    	bmih.biClrImportant = 0;
    
    	void *dibvalues;
    	HBITMAP aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,0,0);
    	if(aBmp==NULL){
    		OutputDebugString("CreateDIBSection failed!\n");
    		return 0;
    	}
    
    	HGDIOBJ OldObj=SelectObject(hdc2,aBmp);
    	BitBlt(hdc2,0,0,width,height,hdc,left,top,SRCCOPY);
    
    	BITMAPFILEHEADER bmfh;
    	ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
    	bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    	bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)
    						 +sizeof(BITMAPINFOHEADER);
    
    	bmfh.bfType=0x4d42;
    	bmfh.bfReserved1 = 0;
    	bmfh.bfReserved2 = 0;
    
    	HANDLE fileHandle=CreateFile(filename,GENERIC_READ|GENERIC_WRITE,(DWORD)0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
    
    	if (fileHandle==INVALID_HANDLE_VALUE){
    	OutputDebugString("CreateFile failed!\n");
    	return 0;
    	}
    
    	DWORD bytes_write=sizeof(BITMAPFILEHEADER);
    
    	DWORD bytes_written;
    	if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL)){
    		OutputDebugString("WriteFile failed!\n");
    		return 0;
    	}
    
    	bytes_write=sizeof(BITMAPINFOHEADER);
    
    	if(!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL)){
    		OutputDebugString("WriteFile failed!\n");
    		return 0;
    	}
    
    	bytes_write=bmih.biSizeImage;
    
    	if(!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL)){
    		OutputDebugString("WriteFile failed!\n");
    		return 0;
    	}
    
    	CloseHandle(fileHandle);
    
    	DeleteObject(SelectObject(hdc2,OldObj));
    	DeleteDC(hdc2);
    	return 1;
    }
    
    int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    	HWND hWnd=GetForegroundWindow();
    	WINDOWINFO wi;
    	wi.cbSize=sizeof(wi);
    	GetWindowInfo(hWnd,&wi);
    	HDC hdc=GetWindowDC(hWnd);
    	LONG width=wi.rcWindow.right-wi.rcWindow.left-2*wi.cxWindowBorders;
    	LONG height=wi.rcWindow.bottom-wi.rcWindow.top-2*wi.cyWindowBorders;
    	char fileName[MAX_PATH];
    	GetTempFileName("c:\\var","img",0,fileName);
    	DC2Bitmap(hdc,wi.cxWindowBorders,wi.cyWindowBorders,width, height,fileName);
    	return 0;
    }
    


  • zu spät..



  • ne das mein ich nich, ich wollte nur ein programm schreiben dass wenn ich z.b. rechte maustaste drücke das dann das derzeitige bild gespeichert wird.
    Das programm soll dann im hintergrund laufen so dass man es binden kann!
    Nur ich bräuchte den befehl von der taste den rest schaff ich schon allein.!

    danke trotzdem!



  • Was verstehst unter "dem Befehl von der Taste"?

    In der FAQ zumindest hättest du folgendes gefunden:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39143

    Und das gepaart mit der VCL-Referenz zum Thema Virtuelle Tastencodes hätte dich wahrscheinlich schon fast ans Ziel gebracht.

    Aber stattdessen schreiben wir lieber unverständliche Posts...



  • Vergisst bitte alles was hier drüber steht^^

    Also ich hab jetzt TButton, und wen ich da drauf klicke soll sich ein Virtueller Tastendruck auslösen( VK_PRINT ) nur wie schreibt man das??



  • THX! habs geschafft!

    keybd_event(VK_SNAPSHOT, 0, 0, 0);
    

    🙂



  • Das Loslassen der Taste nicht vergessen!


Anmelden zum Antworten