pour les mals voyants

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

pour les mals voyants

Message par Thyphoon »

Bonjour,

je cherche a faire un petit programme pour les mal voyants. il s'agit d'une sorte de loupe qui affiche en plein ecran une partie de l'ecran(bureau ou autre logiciel) en suivant la souris.

Mais j'ai quelques problèmes
1-au bout de quelques secondes la copie d'ecran ne se fait pas donc ça palnte.
2-Je trouve ça tres lent si quelqu'un a une idée pour améliorer la chose.

Si j'arrive a faire ce petit programme ça permettra a pas mal de personne mal voyante d'utiliser les ordinateurs de la biblihoteque ou je travail.
Merci d'avance

voici le code que j'ai pondu:(je me suis inspiré de différent code trouvé sur le forum)

Code : Tout sélectionner

Global Mem.l 
; hier werden 1024 byte speicher reserviert 
Mem = AllocateMemory(1024) 

Procedure.l DesktopOutput() 
  PokeL(Mem, 1) 
  ProcedureReturn Mem 
EndProcedure

Global CaptureScreenWidth , CaptureScreenHeight , CaptureScreenBMPHandle 

Procedure CaptureScreenPart(Left.l, Top.l, Width.l, Height.l) 
  dm.DEVMODE 
  BMPHandle.l 
  srcDC = CreateDC_("DISPLAY", "", "", dm) 
  trgDC = CreateCompatibleDC_(srcDC) 
  BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height) 
  SelectObject_( trgDC, BMPHandle) 
  BitBlt_( trgDC, 0, 0, Width, Height, srcDC, Left, Top, #SRCCOPY) 
  DeleteDC_( trgDC) 
  ReleaseDC_( BMPHandle, srcDC) 
  
  CaptureScreenHeight=Height 
  CaptureScreenWidth=Width 
  CaptureScreenBMPHandle=BMPHandle 
  ProcedureReturn BMPHandle 
EndProcedure 

Procedure CaptureFullScreen() 
  ProcedureReturn CaptureScreenPart(0,0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN)) 
EndProcedure 
CaptureFullScreen() 
  If CaptureScreenBMPHandle 
Debug CreateImage(1, CaptureScreenWidth, CaptureScreenHeight) 


ZoomL=320;
ZoomH=240;

;Boucle principal
Repeat
  Delay(1)
  CaptureFullScreen() 
  StartDrawing(ImageOutput()) 
    DrawImage(CaptureScreenBMPHandle,0,0) 
  StopDrawing() 
    x=DesktopMouseX()
    y=DesktopMouseY()
    If x>CaptureScreenWidth-ZoomL
      x=CaptureScreenWidth-ZoomL
    EndIf
    If y>CaptureScreenHeight-ZoomH
      y=CaptureScreenHeight-ZoomH
    EndIf
    GrabImage(1,2,x,y,ZoomL,ZoomH)
    StartDrawing(DesktopOutput())
    ;DrawImage(UseImage(1), 0,0,320,200)
    DrawImage(UseImage(2), 0,0,CaptureScreenWidth,CaptureScreenHeight)
    StopDrawing()
If GetAsyncKeyState_(#VK_ESCAPE) 
    Quit = 1 
  EndIf 
Until Quit 
EndIf
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je n'ai pas compris dans ton code ce que tu cherchais à faire?
Tu affiches en plein écran un bitmap, on fait comment pour agir sur les fenêtres?

J'ai pondu un truc à l'image de ce que WindowXP peut faire, tu le modifieras à ta convenance si ça te convient!

Code : Tout sélectionner

;Nico 
;Le 20/10/05
;PureBasic 3.94

Global pvParam.RECT ,hWndEnfant, Decalage_Hauteur

Procedure Fenetres_Ouvertes() 
  ;Procédure listant les Fenêtres écrite par le Soldat Inconnu 
  hWnd.l = FindWindow_( 0, 0 ) 
  While hWnd <> 0 
    If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; pour lister que les fenêtres visibles 
      If GetWindowLong_(hWnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW ; pour lister que les fenêtres qui ne sont pas des ToolWindow ou barre d'outils 
        txt.s = Space(256) 
        GetWindowText_(hWnd, txt, 256) 
        If txt<> "Ma Fenêtre" 
          If IsZoomed_(hWnd) 
            SetWindowPos_(hWnd, 0, 0, pvParam\top, pvParam\right, pvParam\bottom, #SWP_NOZORDER) 
          Else 
            GetwindowRect_(hWnd,lprect.RECT) 
            SetWindowPos_(hWnd, 0, lprect\left+pvParam\left, lprect\top+pvParam\top, 0, 0, #SWP_NOZORDER | #SWP_NOSIZE) 
          EndIf 
        EndIf 
      EndIf 
    EndIf 
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT) 
  Wend 
EndProcedure 

Procedure WindowCallback(Window, Message, wParam, lParam) 
  
  Select Message 
    Case #WM_CLOSE 
        DestroyWindow_(Window) 
        result  = 0 
    Case #WM_DESTROY 
        PostQuitMessage_(0) 
        result  = 0 
    Default 
        result  = DefWindowProc_(Window, Message, wParam, lParam) 
    EndSelect 
    
  ProcedureReturn result 
EndProcedure 

Procedure CaptureScreen() 

  GetCursorPos_(@point.point)
  
  x=point\x-100
  y=point\y-100 ;-Decalage_Hauteur
  
  Largeur=100*2
  Hauteur=100*2
  
  hdc=GetDC_(0)

  Hdc_dest=GetDC_(hWndEnfant)
  hdcCompt = CreateCompatibleDC_(Hdc_dest)
  
  If CreateImage(0,800,100)
    StartDrawing(ImageOutput())
    Box(0, 0, 800, 100 , RGB(255,255,255))
    StopDrawing()    
  EndIf   
  
  selectobject_(hdcCompt,UseImage(0))
  
  StretchBlt_(hdcCompt, 0, 50-(Hauteur*4/2), Largeur*4, Hauteur*4, hdc, x, y, Largeur, Hauteur,#SRCCOPY) 
  StretchBlt_(Hdc_dest, 0, 0, 800, 100, hdcCompt, 0, 0, 800, 100,#SRCCOPY) 
 
  DeleteObject_( UseImage(0)) 
  ReleaseDC_( 0, hdc) 
  ReleaseDC_( hWndEnfant, Hdc_dest) 
  DeleteDC_(hdcCompt)
  
  ProcedureReturn 1
EndProcedure

Procedure timer(hWnd.l, msg.l, idevent.l, dwtime.l)
  CaptureScreen() 
EndProcedure

SystemParametersInfo_(#SPI_GETWORKAREA,#Null, @pvParam.RECT, 0) 

ExamineDesktops() 
Largeur = DesktopWidth(0) 
Decalage_Hauteur=100

#Style  = #WS_VISIBLE | #WS_BORDER | #WS_SYSMENU 
#StyleEx=0
WindowClass1.s  = "Ma Fenêtre1" 
wc1.WNDCLASSEX 
wc1\cbSize  = SizeOf(WNDCLASSEX) 
wc1\lpfnWndProc  = @WindowCallback() 
wc1\hcursor  = LoadCursor_(0, #IDC_ARROW )
wc1\lpszClassName  = @WindowClass1 
RegisterClassEx_(@wc1) 

If OpenWindow(0, 0, 0, Largeur,Decalage_Hauteur, #PB_Window_BorderLess, "Ma Fenêtre") 
  hWndEnfant  = CreateWindowEx_(#StyleEx, WindowClass1, "Test-Window1",#WS_CLIPSIBLINGS |#WS_CHILD | #WS_VISIBLE, 120, 0, Largeur-120, Decalage_Hauteur, WindowID(0), 0, 0, 0)  
  
  If CreateGadgetList(WindowID(0)) 
    ButtonGadget(0,0,0,100,100,"Quitter") 
    If LoadFont(0,"Arial",20,#PB_Font_Bold)
      SetGadgetFont(0,FontID())
    EndIf  
  EndIf

  pvParam\top=Decalage_Hauteur 
  SystemParametersInfo_(#SPI_SETWORKAREA, #Null, @pvParam, 0) 
  
  SetTimer_(WindowID(0),1,150,@timer())
  Fenetres_Ouvertes() 
  
  Repeat 
    event=WaitWindowEvent() 
    Select event 
      Case #PB_EventGadget 
        Select EventGadgetID() 
          Case 0 
            Quit=1 
        EndSelect 
    EndSelect 
    
  Until Quit=1 
  
  pvParam\top=0 
  SystemParametersInfo_(#SPI_SETWORKAREA,#Null, @pvParam, 0) 
  Fenetres_Ouvertes() 
EndIf
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci nico c'est exelent ton truc... :)

Mais j'aurais besoin du zoom en plein ecran.
Ce que j'essaye de faire dans mon code c'est d'agrandir l'image qu'on voit a l'ecran et que ça scroll lorsque la souris se deplace....
Un peu comme si ton ecran était en 640x480 et que ton desktop était lui en 1024x768 et lorsque tu deplace la souris ça t'affiche donc un bout du desktop centré sur la souris.

Est ce que tu comprends ce que je veux dire ou bien je fais un schema ? :p
Merci en tout cas
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui mais dans ce cas là, je ne suis pas sûr de l'intérêt; autant changer directement la résolution de l'écran!
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

nico a écrit :Oui mais dans ce cas là, je ne suis pas sûr de l'intérêt; autant changer directement la résolution de l'écran!
Actuellement on a un logiciel qui fait ça, et la licence est super couteuse...c'est pour ça que je me suis dit qu'on devait pouvoir fair la même chose.

Normalement l'ecran est normal mais pour les mal voyant on peut utiliser Alt - ou Alt + pour zoomer sur l'ecran a la façon que je decris dans mon poste plus haut.

Vu que nous avons beaucoup d'handicapé et pas de moyen pour avoir plus de de 3, 4 licences pour 400 postes. J'aimerais bien reussir a faire ça.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Tu peux donner le nom du logiciel pour que j'y jette un coup d'oeil.

S'il est si couteux, je pense qu'il doit être assez ardu de vouloir faire la même chose.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

nico a écrit :Tu peux donner le nom du logiciel pour que j'y jette un coup d'oeil.

S'il est si couteux, je pense qu'il doit être assez ardu de vouloir faire la même chose.
Je te donne le nom exacte du logiciel demain pour ne pas te dire de bêtise. Si le logiciel est si cher c'est qu'il fait plein d'autre chose, Mais nous n'avons pas besoin de toutes les fonctionnalités sur la plus part des postes. D'ou l'interêt de garder des licences pour les postes qui utilise toute les fonctionnalités du logiciel et mettre sur tout les autres postes le système de zoom gratuit si j'arrive a en faire hein !!!:p.
Tient d'ailleur si tu veux voir la biblihoteque c'est la BPI du centre pompidou www.bpi.fr Merci en tout cas
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai téléchargé la version d'essai de ZoomText, il correspond au fonctionnement que tu décris.

Par contre si on dépasse le zoom *3, ça devient difficile de naviguer puisque qu'on ne voit qu'une partie de l'écran. :?

Je me demandais donc si vous utilisiez des écrans adaptés en plus du prog?

Je ne vois pas du tout comment réalisez ça! et c'est bien vrai que ça coute cher ce genre de prog; il intègre la synthèse vocal en plus.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

nico a écrit :J'ai téléchargé la version d'essai de ZoomText, il correspond au fonctionnement que tu décris.

Par contre si on dépasse le zoom *3, ça devient difficile de naviguer puisque qu'on ne voit qu'une partie de l'écran. :?

Je me demandais donc si vous utilisiez des écrans adaptés en plus du prog?

Je ne vois pas du tout comment réalisez ça! et c'est bien vrai que ça coute cher ce genre de prog; il intègre la synthèse vocal en plus.
Il s'agit bien de ZoomText ! on a 5 postes qui se sert de la synthese vocal dans des pieces et on voudrait mettre sur les 300 autres postes uniquement une fonction de zoom ...Pas d'ecran spécial. On a juste des ecran 21" ! Mais bon juste pour un zoom ça fait cher la license ! :( C'est vrai que c'est pas evident a faire...je me demande comment ils fonts
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'avais trouvé un prog gratuit qui faisait ça sous Window 98.

C'était un bureau virtuel.

Tu créais, par exemple, en écran avec une résolution de 1280x1024, mais affichée en 800x600. Il n'y avait donc qu'une portion de l'écran qui était affichée, et tu scrollait avec le pointeur de la souris, en le collant contre un bord de l'écran. Comme il n'y avait qu'une partie de l'image pour une même surface, elle était donc zoomée

Je ne me souviens pas du nom, et comme je n'avais pas aimé, je l'avais viré assez rapidement, mais il existe peut-être encore
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Chris a écrit :J'avais trouvé un prog gratuit qui faisait ça sous Window 98.

C'était un bureau virtuel.

Tu créais, par exemple, en écran avec une résolution de 1280x1024, mais affichée en 800x600. Il n'y avait donc qu'une portion de l'écran qui était affichée, et tu scrollait avec le pointeur de la souris, en le collant contre un bord de l'écran. Comme il n'y avait qu'une partie de l'image pour une même surface, elle était donc zoomée

Je ne me souviens pas du nom, et comme je n'avais pas aimé, je l'avais viré assez rapidement, mais il existe peut-être encore
j'ai fait des recherches mais j'ai rien trouvé de pratique a utilisé ...et qui sois stable... :(
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Si je comprend bien tu veux écrire un programme qui se met au premier plan et qui t'affiche l'impression d'écran du bureau zoomé (bureau qui est sous ta fenêtre), et ensuite sur ta fenêtre que tu puisses cliquer, écrire,... et toutes ces actions se répercutent sur le bureau

Et ben! 8O

L'impression du bureau et le zoom ça ne pose pas trop de probs, par contre le reste, ça va être chaud!

Je vais étudier la question et je vais essayer de te pondre quelque chose :?

En tout cas bon courage :)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

tu as tout compris Gillou ! lolllll
Au depart je m'étais dit que c'était pas si difficile ...mais finalement...c'est pas une mince a faire lollllllll
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

pour obtenir le "bureau qui est sous la fenetre" il faut peut etre chercher du c^té de GetDC_(GetDesktopWindow_())

(je n'ai pas essayé)

Dri
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai essayé mais ça n'a pas marché; j'ai l'impression qu'il faudrait lire directement la mémoire vidéo.
Répondre