![]() |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
dcDesktop := GetWindowDC(hDesktop);
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Bei den AlphaControls ist auch eine (sehr gut funktionierende) Lupe dabei.
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Delphi-Quellcode:
funktioniert es nicht, da ist das Bild schwarz.
dcForm := GetWindowDC(Form1.Handle);
Mit
Delphi-Quellcode:
kann man das aktive Formular capturen.
hForm := GetForegroundWindow;
dcForm := GetWindowDC(hForm); |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Interessant, aber für mich bleibt die Kernfrage:
Was macht VISTA(+AERO) anders? Hier muss es ja einen grundlegenden Unterschied geben? Der ist für mich noch nicht erkennbar :( |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
Zu den Artefakten in meinem Programm: Wie gesagt, es ist ein Kompromiss. Meiner Meinung immer noch besser, als wenn der gezeigte Ausschnitt gar nicht aktuell ist. Zitat:
Wie auch immer, jedenfalls war die Möglichkeit des Auslesens der Pixel unter dem Fenster, eindeutig ein Bug, der durch einen Workaround entstanden zu sein scheint, und kein Feature. Deshalb ist es IMO auch prinzipiell richtig, dass das unter Vista nicht mehr funktioniert. Dass man verdeckte Bereiche unter Windows nicht auslesen kann (außer XP und vllt Win2k durch Ausnutzen eines Bigs), war schon immer ein Problem, und es ist ärgerlich, dass es dafür keine Möglichkeit zu geben scheint (zumindest keine mir bekannte). Soweit ich weiß, kann man mit einer WM_PRINT (?) Message zumindest unverdeckte Screenshots von einzelnen Fenstern machen - die geben aber leider nicht exakt das zurück, was auf dem Bildschirm sichtbar wäre (z.B. ohne Aero). |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Interessant, vielen Dank für die Erklärung.
Dann funktionieren also die meisten Lupen aufgrund eines Bugs so gut - schon witzig. Eine Lösung, das auch unter Aero hinzubekommen, ist dann vermutlich entweder gar nicht möglich oder nur von wirklichen Profis, die die Internas sehr gut kennen, realisierbar. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Die Lupe von den AlphaControls zeigt immer nur ein aktives Formular an.
Das ist etwas unerwartet, funktioniert aber insgesamt sehr gut. Formularinhalte werden ständig aktualisiert. Demo unter ![]() Vielleicht kann das als Anregung helfen... stahli |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
@NamenLozer:
Stimmt echt interessant, hab jetzt den QC gefunden und ich habe es auch mit dem Bug gemacht :stupid: Heißt das jetzt, meins läuft unter Vista auch nicht? Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Irgendwelche Themes laufen oder anderes Zeugs ? |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
@turboPASCAL: Ich hab den klassischen Win9x Stiel ohne Extras oder anderes Zeugs :mrgreen:
Edit: Roter Kasten: Oberstes Zip und dann im Menü Open magn... Edit²: Das kleine Lupelchen frisst 100% CPU :shock: |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
@NamenLozer: Sorry, im Menü der MainDemo.
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Bei einer Lizenz mit Quellen schon ;-)
Ich kann das durchaus empfehlen :-) Habe nur gute Erfahrungen gemacht. Stahli |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Unter XP ist das Geflacker jetzt weg. Das Formular ist transparent und das Image wird periodisch aktualisiert. Vistatauglich wird es wohl trotzdem nicht sein!?
Nachtrag: Was mich stört, ist, dass das Formular nach dem Loslassen keinen negativen Wert für Top erlaubt und der Button zum Beenden benötigt wird. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Das müsste man noch ausprobieren.
Für die Lösung des Aeroproblems bietet jemand bis 600 USD: ![]() |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Das ist ja äußerst interessant!
Allerdings dürften dann unsere Chancen auf eine kostenlose Lösung innerhalb der DP eher schlecht stehen. Obwohl, hier im Forum gibt es ja bestimmt auch einen ganze Reihe von Spezialisten, denen ich das zutrauen würde. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm keine ahnung ob es unter Vista läuft.
Schließen der Lupe einfach mit der Maus in die obere linke Screen ecke fahren. gruss Emil |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Sie funktioniert, teilweise. ;) Nach ein paar Scekunden schiesst sich das Programm ohne eine Fehlermeldung.
Den Desktophintergrund wird mit dem Prg. nicht angezeigt. Wie arbeitet denn das Teil ? |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Hmm glaube aber du hast Vista. Arbeiten tut es mit Standard API's CreateRoundRectRgn DeleteObject GetCursorPos GetModuleHandle GetProcAddress GetWindowDC ReleaseDC SetWindowPos SetWindowRgn StretchBlt und einen Timer.. 50ms geht aber auch in realzeit also 1ms mit 0% CPU auslastung. Hab das Teil mal als Plugin (VB) für meinen Mediaplayer geschrieben. Der Source !! VB Hab keine lust das jetzt zu übersetzen dürfte aber nicht schwer sein da es nu um API und Koordinaten geht.
Delphi-Quellcode:
Bei Magnify 1 und Viewsize 80 wird alles unterhalb der Form angezeigt im Oroginal Maßstab.
Option Explicit
#Const Rounded = True 'False = wird als Rechteck angezeigt Private Const Magnify As Long = 5 'Magnify Faktor Private Const ViewSize As Long = 40 'Größe des Areals zu Magnify (in pixel) Private Const ViewSize2 As Long = ViewSize \ 2 Private Const DestSize As Long = ViewSize * Magnify Private Const DestCenter As Long = DestSize \ 2 Private Const CrossCenter As Long = DestCenter + Magnify \ 2 + (Magnify And 1) Private Const Border As Long = 1 Private ScrXMax As Long Private ScrYMax As Long Private Type tPoint x As Long y As Long End Type Private CursorPos As tPoint Private PrevPos As tPoint Private Cnt As Long Private xPos As Long Private yPos As Long Private Const hWndDesktop As Long = 0 Private hDCDesktop As Long Private hRgn As Long Private Const HWND_TOPMOST As Long = -1 Private Const SWP_NOSIZE As Long = 1 Private Const SWP_NOMOVE As Long = 2 Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As tPoint) As Long Private Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function StretchBlt Lib "gdi32" (ByVal hDstDC As Long, ByVal xDst As Long, ByVal yDst As Long, ByVal nDstWidth As Long, ByVal nDtsHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long Private Sub Form_Load() If App.PrevInstance Then Beep 333, 100 Beep 222, 222 Unload Me Else SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE hDCDesktop = GetWindowDC(hWndDesktop) Width = ScaleX(DestSize + Border + Border, vbPixels, vbTwips) Height = Width Show tmrRefresh_Timer #If Rounded Then '------------------------------------------------------------------ xPos = ScaleWidth hRgn = CreateRoundRectRgn(2, 2, xPos, xPos, xPos, xPos) SetWindowRgn hwnd, hRgn, True #End If '--------------------------------------------------------------------------- With Screen ScrXMax = ScaleX(.Width, vbTwips, vbPixels) - ViewSize ScrYMax = ScaleY(.Height, vbTwips, vbPixels) - ViewSize End With App.TaskVisible = False End If End Sub Private Sub Form_Unload(Cancel As Integer) If hDCDesktop Then ReleaseDC hWndDesktop, hDCDesktop End If If hRgn Then DeleteObject hRgn End If End Sub Private Sub tmrRefresh_Timer() GetCursorPos CursorPos With CursorPos If .x <> PrevPos.x Or .y <> PrevPos.y Or Cnt = 0 Then PrevPos = CursorPos If .x = 0 And .y = 0 Then Unload Me Else xPos = ScaleX(.x + ViewSize2, vbPixels, vbTwips) yPos = ScaleY(.y + ViewSize2, vbPixels, vbTwips) If xPos + Width > Screen.Width Then xPos = Screen.Width - Width End If If yPos + Height > Screen.Height Then yPos = Screen.Height - Height End If If xPos = Screen.Width - Width And yPos = Screen.Height - Height Then xPos = ScaleX(.x - ViewSize2, vbPixels, vbTwips) - Width yPos = ScaleY(.y - ViewSize2, vbPixels, vbTwips) - Height End If Move xPos, yPos xPos = .x - ViewSize2 yPos = .y - ViewSize2 Cls StretchBlt hDC, Border, Border, DestSize, DestSize, hDCDesktop, xPos, yPos, ViewSize, ViewSize, vbSrcCopy Line (CrossCenter, CrossCenter - 7)-(CrossCenter, CrossCenter + 8), vbRed Line (CrossCenter - 7, CrossCenter)-(CrossCenter + 8, CrossCenter), vbRed #If Rounded Then '------------------------------------------------------------------ DrawWidth = 2 DrawMode = vbCopyPen Circle (DestCenter - 1, DestCenter - 1), DestCenter - 2, vbBlack DrawWidth = 1 DrawMode = vbMergePenNot #End If '--------------------------------------------------------------------------- End If End If Cnt = (Cnt + 1) Mod 16 End With End Sub vbPixels := 15 mit Cls wird der Hintergrund gelöscht und dann mit StretchBlt neu gezeichnet. Das andere ist selbsterklärend. gruss Emil |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Mein Gehirn arbeitet nicht mehr so richtig.. Hab wohl Alsheimer. gruss Emil |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Hallo, ein gesundes neues ...
Leider vergrößert die Lupe das, was unter der Maus und nicht unterm "Lupenglas" ist. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
gruss Emil |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
[Edit]Sorry, hab irgendwie nicht gesehn, dass danach noch eine Seite kam :pale:[/Edit] |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Schließlich möchte ich den Arbeitsbereich vergrößern auf dem ich zeige, das ist nun mal der bereich auf dem die Maus zeigt. Um den bereich unter meiner Form anzuzeigen braucht man keine Lupe da reicht es wenn man die Form transparent macht. Ich verweise einfach noch mal auf den Beitrag von Sunlight7 ![]() gruss Emil |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Also bei mir klappt das Ding wunderbar, auch unter Vista...
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Könnte freundlicherweise wer einen Vista/Aero Bericht geben? http://www.delphipraxis.net/images/s...on_biggrin.gif
![]() |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 2)
Noch zwei Versuche. Verschieben mit der Maus. Beenden mit Doppelklick.
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Dein Programm funktioniert, ist aber nicht die Antwort auf die Frage. @Sunlight7: Nicht mit Vista kompatibel. @Garfield: dito. |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
@Garfield, :mrgreen: Es lupt nicht. (mit Vista und akt. Aero) :P
Mann muss dann bzw. deswegen mit DirectX arbeiten siehe ![]() |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
Zitat:
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt habe ich die Trial von Server 2008 Standard installiert, aber da gibt es nur das klassische Design. Damit hat es funktioniert, aber ob es mit Aero geht...?
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
tja, deswegen gibt's für die Lösung wohl auch 600 Dollar :cry:
|
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Ich weiß jetzt nicht, ob es zum Thema passt, aber bei den Alphas(
![]() ![]() |
Re: Bildschirmlupe - Bereich unter Formular ermitteln
Zitat:
@Dbof: Das wurde weiter vorne schon angesprochen ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz