JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Capture d'une zone de l'écran total Jeu 23 Déc 2021 - 20:40 | |
| En fait j'avais besoin d'un texte avec divers enrichissements, centrage, etc, à insérer dans un picture (menus de réveillon, eh oui). J'ai trouvé plus simple de le créer dans Wordpad, et de recopier la zone choisie dans le picture. (la zone peut contenir n'importe quoi, y compris des images, c'est une capture graphique). La zone à saisir peut être variable, pour moi c'était 1/4 de feuille A4, c'est à dire 389x550 pixels sur mon écran, mais ça peut être n'importe quoi. Je saisis le texte dans le traitement de texte wordpad, je le mets en forme à ma guise, puis je lance la sub qui affiche un rectangle de saisie, déplaçable sur l'écran avec 4 flèches et d'un nombre de pixels réglable, puis sur clic 'OK' capture la zone dans un fichier ou dans le presse-papier et se ferme. Voici: - Code:
-
DIM x,y,w,h,fs$ fs$ = "Z:\Capt.bmp": ' fichier de capture WIDTH 0,410: HEIGHT 0,590: BORDER_SMALL 0: COLOR 0,100,180,180 PICTURE 1: WIDTH 1,389: HEIGHT 1,550 EXECUTE "C:\Windows\System32\write.exe" w = 389: h = 550 x = 240: y = 175: ' aebitraire, n'importe où (déplaçable ensuite) Capture_zone(x,y,w,h,fs$) pause 500 file_load 1,fs$ end
SUB Capture_zone(x,y,w,h,fs$) ' Capture de la zone de dimensions w x h en x,y de l'écran total, ' Résultat dans fs$ (bmp) ou clipboard si fs$ = "" IF LABEL("Depla") = 0 THEN LABEL Depla IF LABEL("Derec") = 0 THEN LABEL Derec IF LABEL("Quits") = 0 THEN LABEL Quits DIM_LOCAL ff,e,f1,f2,f,fh,fb,fl,fr,p,x1,y1,x2,y2 DIM_LOCAL b1,b2,b3,b4,b5,b6,b7,b8,i,j,k e = 8: ' épaisseur du trait enveloppe ' Rectangle de saisie f1 = 500 x1=x-1: y1=y-1: x2 = x1+w+2*e: y2 = y1+h+2*e fh=f1: FORM fh: COLOR fh,255,0,0: BORDER_HIDE fh: ' haut du rectangle TOP fh,y1: LEFT fh,x1: WIDTH fh,w+2*e: HEIGHT fh,e fb=fh+1: FORM fb: COLOR fb,255,0,0: BORDER_HIDE fb: ' bas TOP fb,y2: LEFT fb,x1: WIDTH fb,w+2*e: HEIGHT fb,e fl=fb+1: FORM fl: COLOR fl,255,0,0: BORDER_HIDE fl: ' gauche TOP fl,y1: LEFT fl,x1: HEIGHT fl,h+2*e: WIDTH fl,e fr=fl+1: FORM fr: COLOR fr,255,0,0: BORDER_HIDE fr: ' droite TOP fr,y1: LEFT fr,x2: HEIGHT fr,h+2*e: WIDTH fr,e FOR i = fh TO fr: TO_FOREGROUND i: NEXT i
f2 = 400: FORM f2: BORDER_SMALL f2: WIDTH f2,200: HEIGHT f2,61: FONT_SIZE f2,12 TO_FOREGROUND f2: CAPTION f2," DÉPLACEMENT ZONE SAISIE" color f2,255,0,0 b1=f2+1: BUTTON b1: PARENT b1,f2: LEFT b1,2: WIDTH b1,25: CAPTION b1,CHR$(231) b2=b1+1: BUTTON b2: PARENT b2,f2: LEFT b2,LEFT(b1)+26: WIDTH b2,25: CAPTION b2,CHR$(232) b3=b2+1: BUTTON b3: PARENT b3,f2: LEFT b3,LEFT(b2)+26: WIDTH b3,25: CAPTION b3,CHR$(233) b4=b3+1: BUTTON b4: PARENT b4,f2: LEFT b4,LEFT(b3)+26: WIDTH b4,25: CAPTION b4,CHR$(234) FOR i = b1 TO b4: TOP i,1: FONT_NAME i,"Wingdings": ON_CLICK i,Depla: NEXT i b7=b4+1: SPIN b7: PARENT b7,f2: LEFT b7,LEFT(b4)+26: WIDTH b7,45: POSITION b7,1 b8=b7+1: BUTTON b8: PARENT b8,f2: TOP b8,1: LEFT b8,LEFT(b7)+WIDTH(b7)+1: WIDTH b8,30 CAPTION b8,"OK": ON_CLICK b8,Quits WHILE ff = 0: PAUSE 300: END_WHILE: EXIT_SUB ' ---------- Depla: i = NUMBER_CLICK: j = i-b1+1: k = POSITION(b7) SELECT j CASE 1: x1 = x1-k: x2 = x2-k CASE 2: x1 = x1+k: x2 = x2+k CASE 3: y1 = y1-k: y2 = y2-k CASE 4: y1 = y1+k: y2 = y2+k END_SELECT GOSUB Derec RETURN ' ---------- Derec: TOP fh,y1: LEFT fh,x1 TOP fb,y2: LEFT fb,x1 TOP fl,y1: LEFT fl,x1 TOP fr,y1: LEFT fr,x2 RETURN ' ---------- Quits: ' Capture et quitte DLL_ON "user32" i = DLL_CALL4("keybd_event",44,0,0,0): ' sauvegarde de tout l'écran -> clip DLL_OFF p=fr+1: PICTURE p: HIDE p: WIDTH p,SCREEN_X: HEIGHT p,SCREEN_Y CLIPBOARD_PASTE p: 2D_TARGET_IS p IMAGE p+1 2D_TARGET_IS p: 2D_IMAGE_COPY p+1,x1+e,y1+e,x2-e,y2-e IF fs$ = "" CLIPBOARD_COPY p+1 ELSE FILE_SAVE p+1,fs$ END_IF 2D_TARGET_IS 0: FOR x = f1 TO f1+5: DELETE x: NEXT x DELETE f2: ff = 1 RETURN END_SUB Au fait, bon Noël à tous, les amis ! | |
|
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Capture d'une zone de l'écran total Ven 24 Déc 2021 - 5:41 | |
| J'ai changé Z: par C: en ligne 2 Puis j'ai essayé avec une phrase et une image avec Write placé le rectangle et cliqué sur Ok, mais je n'ai pas eu d'enregistrement de Capt.bmp en C: ????? Sinon, bravo, belle performance, comme technique, ce rectangle qui se déplace en transparence ! Et bon Noël, au fait !!! | |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Capture d'une zone de l'écran total Ven 24 Déc 2021 - 9:28 | |
| Salut jjn4,
(Z: c'est chez moi une partie de la mémoire vive qui est définie en volume de manoeuvre, pratique pour enregistrer des fichiers temporaires qui sont effacés automatiquement à l'extinction du pc)
Bizarre, je viens d'essayer avec C:, le fichier bmp est bien créé chez moi... tu n'as pas quelque part une interdiction d'écrire directement sur la racine du disque ? quoique... Désolé, je n'ai pas d'explication... Sinon tu peux toujours passer par le presse-papier, fs$ = "" et l'image est dans le presse-papier, enfin, j'espère, ça marche aussi comme ça chez moi.
J'espère que ça ne va pas gâcher ton Noël ! Bon Noël à toi aussi et à tous les autres ! | |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Capture d'une zone de l'écran total Ven 24 Déc 2021 - 16:13 | |
| Tu dois avoir raison papydall (comme toujours...) Pour voir si on est autorisé à écrire à la racine du disque C, Dans l'explorateur de fichier, clic sur le disque, 'Propriétés', onglet 'Sécurité', 'Autorisations pour Utilisateurs authentifiés', 'Écriture'... (sous W7, ça doit être semblable sous W10). | |
|
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Capture d'une zone de l'écran total Dim 26 Déc 2021 - 13:31 | |
| Le répertoire TEMP ne se trouve pas nécessairement à la racine, voici un code pour trouver son emplacement: - Code:
-
print DIR_TEMP$()
end fnc DIR_TEMP$() dim_local DIR_TEMP_DOLLAR_c$,DIR_TEMP_DOLLAR_dword% peek_reverse DIR_TEMP_DOLLAR_c$=string$(260," ") ' appel de la dll DLL_ON "kernel32.dll" ' appel de la fonction DIR_TEMP_DOLLAR_dword% = DLL_CALL2("GetTempPathA",260,peek32(adr(DIR_TEMP_DOLLAR_c$))) :' obtient le chemin; 'DIR_TEMP_DOLLAR_dword%' = nombre de caractères DLL_OFF result trim$(DIR_TEMP_DOLLAR_c$) end_fnc
| |
|