Hjälp på traven med att koda ett program som läser av skärmen i Windows Vista

Permalänk
Testpilot

Hjälp på traven med att koda ett program som läser av skärmen i Windows Vista

Halloj, har ett litet problem och skulle behöva lite hjälp på traven för att komma igång.

Har för ett tag sen byggt en koppling till min dator som skapar samma effekt som Philips Ambilight, ni kan läsa om bygget här om ni är intresserade: http://www.sweclockers.com/album/?id=2761

Problemet är att programmet som jag använder (heter BobLight) inte funkar särskillt bra till Vista då det från början verkar ha utvecklats till XP. För att få programmet att funka till Vista måste man stänga av Aero-temat och till spel funkar programmet i princip inte alls.

Antar att problemet beror på att Vista har ett helt nytt sätt att hantera grafik iomed WDDM och att då hela skrivbordshanteraren renderas av DirectX.

Programmet funkar så att det läser av skärmen och skapar ett färgmedelvärde inom olika områden som sedan skickas över serieporten. Man kan köra programmet utan att ha lampor kopplade till datorn då det har tre fält som visar vilken färg som ska skickas. Ni kan ladda ner det här om ni vill se hur det fungerar: http://www.xs4all.nl/~loosen/elektronica/BobLight/

Det jag nu vill göra är att skapa ett program som funkar till Vista med Aero-gränssnittet påslaget och allra bäst vore om det även funkade till spel. Problemet är att jag vet i princip ingenting om Windowsprogrammering utan har bara programmerat enkla konsollprogram i C++ så jag vet liksom inte var jag ska börja. Är C# med .NET och det ett bra sätt att börja? antar att det är ett av dom enklaste sätten att komma igång.

Sen är även problemet att jag inte riktigt vet hur ett sådant program ska byggas upp. BobLight verkar använda en funktion som heter GetPixel (som tydligen är väldigt långsam att köra då Aero är aktiverat) som läser av varje pixel inom ett område vilket inte känns helt optimalt.

Nån som har en bra idé på hur man löser det här smidigast? kan man ta mängder av hela skärmdumpar och göra nån sorts bildbehandlig på det? programmet måste klara av att skapa färger iallafall i minst 10 bilder/sekund men upp emot 25 bilder/sekund är önskvärt.

Är inte alls ute efter nån hel lösning eller program utan behöver bara lite hjälp var man börjar och kanske nått exempel på en funktion som skulle passa. Har som sagt noll koll på hur man programmerar program som interagerar med Windows på det här viset.

All hjälp är uppskattad, tack på förhand

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Jag har tyvärr inga svar. Ville bara kommentera projektet i sin helhet. Kollade in din bygglogg och tillhörande YouTube-video och måste säga att jag är riktigt impad Det måste bli en riktigt häftig upplevelse!

Speciellt valet av spel gillar jag, FlatOut Uppföljaren, FlatOut 2 är det sista spelet jag köpte (2006). Sedan dess har jag inte spelat några moderna spel.

I villet fall hoppas jag att du får hjälp, det kan inspirera andra att göra liknande

MVH

Johan

Visa signatur

Stek mer! - Flingor - Schampo
Överklockning är är lika överskattat som din dator är överklockad.

Permalänk
Medlem

Får också säga att det är ett roligt projekt

Har ingen erfarenhet av detta, men det är möjligt att det finns funktioner för detta i Windows API. Det är ganska smidigt att programmera mot det i .NET.

Eventuellt kan du kolla på direct x .NET.
http://msdn.microsoft.com/sv-se/directx/default(en-us).aspx

Hoppas du får hjälp av någon kunnig.

Mvh

Visa signatur

Solen i africa! Hjälp snabbt. Tävling i klassen!
Det var High noon.
Om solen i Africa en truckförare kommer från East till Weast på huvudvägen. och exact vid eqvatorn vid Africa. Landskapet är totalt slät. På en tidpunkt var solen så ett par telestolpar gjorde så att det blev skugga.
3 gissar jag på, men kan inte förklara?

Permalänk
Medlem

Edit:

bah märkte att länken inte var bra

Visa signatur

Stationär: Ubuntu GB DQ6 P35 | Q6600 | 4GB ram Corsair 2*2gb 800mhz (3.5gb) |1tb SATA + 500gb SATA + 250gb SATA | Sparkle 9800gt Passiv
Laptop: Lenovo 3000 v200 | Ubuntu |

Permalänk
Testpilot

Sockan: Det du länkade till verkar handla om att skapa bilder med setpixel, inte att läsa bilder och sen avkoda dom.

Vad tror ni om att läsa in 25 skärmdumpar i sekunden och sen läsa från dom bilderna? eller blir det toksegt? Hur löser exempelvis programmet Fraps det när det spelar in spel?

En kompis snackade nått om att läsa av framebuffern till grafikkortet och på så vis får tag på bilden som skickas till grafikkortet, i Vista borde väl skrivbordet och spel gå samma väg till grafikkortet? Skulle det funka att göra på det viset och är det isåfall nån som har nått tips om hur det skulle göras?

Nu käns det som att jag bara har hundra frågor men det vore skitnajs om någon bara kunde tipsa om nån bra guide/tutorial/artikel som tar upp nåt av det jag eftersöker så man iallfall kan komma nån bit på vägen.

johle: Faktiskt så är filmen från spelet FlatOut: Ultimate Carnage som i princip är en upphottning av 2:an med bättre grafik till Xbox 360 och PC. Kan för övrigt rekommendera 2:an starkt, särskilt om man kör med ratt.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk

Borde det inte gå medelvärdesbilda signalerna som går från grafikkortet till skärmen? Kanske inte det lättaste att göra, men resultatet borde ju bli det bästa plus att det drar nada systemresurser från persondatorn och fungerar på alla OS. -Jag är dock inte insatt i hur dessa videosignaler fungerar, men det var ju en nyhet på sweclockers för ett tag sedan om en som gjorde ett mikdrodator projekt med vga utgång.
Samma metod borde gå göra till signalen till en vanlig tv, alltså läsa av scart.
Nu har det dock kommit en hel del nya videosignalkablar, detsamma för datorn, annars kunde man göra en för vga och så ha denna lösning för all framtid.

Angående mjukvaran så finns det folk här som är extremt mycket bättre än mig på windowsprogrammering. Men det blir det lite nästlade loppar för att medelvärdbilda alla pixlar, vilket faktisk drar märkbar prestanda på en ny dator.

*edit*
Kör man med en billig Attiny som gör detta och skickar medelvärdet, så kan man dessutom ha nuvarande system precis som det är. Man behöver ej koda lika effektivt heller med tanke på realtidskraven som man ställer.
Frågan är bara hur svårt är min ide är att göra?

Visa signatur

[Core i7-3930K med 32GB ram, 2*256GB SSD] & [Core i7 3770K med 16 GB RAM, 256GB SSD] som tillsammans har ett [HD 5850 1GB] och 3st 24".

Permalänk
Medlem

Jag håller själv på med ett projekt för närvarande som involverar att ta skärmdumpar och tolka dem, så jag slängde ihop ett litet kommenterat exemplelprojekt som jag hoppas du får nytta utav.

Det är skrivet i C++ och använder sig utav Win32 API, projektet öppnar du lämpligen i MS Visual studio 2005 eller senare.

För att se om exempelprogrammet funkar bra i vista kan du tanka det här och testa. Programmet ska öppna ett fönster och visa en skärmdump.

Källkoden kan du tanka ner här.

För att sedan gå vidare rekommenderar jag dig att läsa lite om Win32 API (här är en bra tutorial) och om du vill kolla upp specifika funktioner gör du det lämpligen på MSDN

Permalänk
Medlem

bud_bundy har en intressant idé, frågan är bara hur man läser av den information som skickas ut genom VGA- (eller DVI-) kabeln. Två metoder bör finnas; mjukvara där man på något sätt integrerar programmet med operativsystemets grafikrutiner och läser av informationen innan den skickas, eller hårdvara där man bygger antingen en enkel krets som kopplas in mellan datorn och skärmen och som läser av den data som går i DVI- eller VGA-kabeln och skickar tillbaka denna via t.ex. USB eller seriellport, eller en mer avancerad version som beräknar de data som behövs och sedan skickar det till de lampor som ingår i backlightingen.

Vet inte hur det är med mjukvarumetoden, den lär inte kosta något men jag tvivlar på att det är lätt att göra, om det ens går. Hårdvarumetoden är jag nästan helt säker på att den fungerar men den kräver helt klart mer jobb och framför allt måste man lägga ut pengar på det. Samtidigt är det en mer portabel lösning som är plattformsoberoende på alla sätt, så länge det finns en VGA- (eller DVI-) anslutning så kommer den att fungera.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av You
Hårdvarumetoden är jag nästan helt säker på att den fungerar men den kräver helt klart mer jobb och framför allt måste man lägga ut pengar på det. Samtidigt är det en mer portabel lösning som är plattformsoberoende på alla sätt, så länge det finns en VGA- (eller DVI-) anslutning så kommer den att fungera.

Hårdvarumetoden är absolut en intressant idé, och enligt mig roligare än någon mjukvarumetod :). Tycker inte att det behöver vara så avancerat och dyrt egentligen. Eftersom VGA-signaler har separata stift för röd, grön och blå färg borde det räcka med att räkna ut duty cyclen (dvs. hur långe respektive färg är på procentuellt) och det enklaste sättet att göra det på torde vara med några motstånd och kondensatorer med rätt värde samt AD-omvandlare (något som kanske tom finns inbyggt i mikroprocessorn som hunden använder). DVI kan dock bli lite krångligare kom jag på.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av robert_o
DVI kan dock bli lite krångligare kom jag på.

Inte nödvändigtvis, DVI-I och givetvis också DVI-A har analoga stift, de fyra ute i ena hörnet, med jordningen i form av ett kors mellan de fyra stiften. Är inte helt insatt i hur detta fungerar, wikipedia har inte mycket om den analoga överföringen - bara "RGB bandwidth: 400 MHz at -3 dB".

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av You
Inte nödvändigtvis, DVI-I och givetvis också DVI-A har analoga stift, de fyra ute i ena hörnet, med jordningen i form av ett kors mellan de fyra stiften. Är inte helt insatt i hur detta fungerar, wikipedia har inte mycket om den analoga överföringen - bara "RGB bandwidth: 400 MHz at -3 dB".

Sant, DVI-A/DVI-I har ju analoga signaler med separata stift för RGB, dock tror jag inte att grafikkortet sänder dessa signaler om man kör med digital DVI, något som man antagligen vill köra om man har en fin höguplöst plattskärm

Permalänk
Testpilot

Jag har faktiskt lyckats koda om det ursprungliga programmet så att det funkar med Aero i Vista. Använder funktionen CopyFromScreen för att ta skärmdumpar till minnet och räknar sen ut färger från dom. Tyvärr funkar det inte i spel utan det verkar som att man är tvungen att hämta bilder från grafikkortets backbuffer.

Har hittat en funktion som heter GetBackBuffer men har inte riktigt lyckats lista ut hur jag ska använda den då man måste skapa nån form av device innan som jag inte lyckas få till. Ska kolla mer på det imorgon.

Hårdvarumetoden är helt klart intressant men verkar snäppet lurigare att lösa då det känns svårare att läsa alla synk-signaler och VGA är väl dessutom analogt så då måste man konvertera och ha sig.

Om nån har en bra tutorial om hur man använder GetBackBuffer till att hämta en skärmdump så tror jag att allt skulle kunna lösa sig rätt smidigt, allt jag hittar verkar dock vara ofullständig kod som kräver att man initierat en device vilket jag inte hittar hur man gör ordentligt.

Här har ni lite info om GetBackBuffer och som ni ser så verkar det som att det räknas med att man har en Device som man kan använda GetBackBuffer på men hur skapar man själva devicen?
http://msdn.microsoft.com/en-us/library/microsoft.windowsmobi...
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=346470&...
http://www.tech-archive.net/Archive/Development/microsoft.pub...

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Device är din egen device som du har och ritar på, men i ditt fall så vill du hämta ut devicen från ett annat program, inte skapa den.

Ta en titt på dessa:

FindWindow
GetWindowDC
GetDC

http://msdn.microsoft.com/en-us/library/ms533241(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms534830(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms533241(VS.85).aspx

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Testpilot

Dock är det väl just här problemet ligger iomed att GDI inte längre verkar användas i Vista utan bara finns med som nån form av bakåtkompabilitet.
http://en.wikipedia.org/wiki/Graphics_Device_Interface#GDI_an...

Edit: Tycker det är konstigt att ingen stött på det här problemet innan, är det ingen som vill kunna ta skärmdumpar i exempelvis spel med egna program under Vista? eller är jag helt enkelt för tidigt ute och måste vänta på att Vista blir mer mainstream?

Hur fungerar exempelvis programmet Fraps? läste nånstans om att den hookar nån dll-fil för DirectX, det låter alldeled för invecklat för att jag ska kunna klara av det.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]