Autor Thema: Windows Treiberprogrammierung - Virtueller Monitor  (Gelesen 21180 mal)

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« am: 15. December 2010, 14:41 »
Hallo,

Ich nutze es grad mal etwas aus, dass wir ja offiziell ein "Lowlevel" Forum sind und explizit nicht nur ein Betriebssystem-Forum  :-)

Ich weiß, dass die meisten von euch Linux haben/benutzen. Hoffe jedoch vllt. doch ein bisschen weiter zu kommen. Was ich prinzipiell machen will/müsste wäre einen Treiber für einen virtuellen Monitor zu schreiben. Ich hab allerdings nicht mal ne Ahnung ob sowas überhaupt möglich ist.

Abgesehen davon, wüsste ich gerne ob es ein Forum rund um (Windows) Treiber-Entwicklung gibt. Habe jetzt bisher noch nichts anständiges gefunden. Zumindest kein Forum wo ich das Gefühl habe dass mir dort je irgendjemand auf meine Fragen antworten wird.

Oder vielleicht auch ein paar weiterführende Tutorials. Alles was ich bisher gefunden hab ging nicht (weit) über "Hallo Welt" hinaus.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Programm Noob

  • Gast
Gespeichert
« Antwort #1 am: 15. December 2010, 15:36 »
Moin

Gehört das nicht eigentlich, wie die anderen Programmierfragen zu Windows auch ins OT Forum?

Aber egal
Ich habe selber mal versucht Treiber für Windows zu schreiben. damals ging es um einen Dateisystemtreiber. Ich finde das Projekt was ich damals gefunden habe nicht wieder. es war eine Projektarbeit an einer Uni. war nen ext2 Treiber für Windows. Ich hoffe das du mit den Stichwörtern was bei google Wirst. und das dir das weiterhilft.
Viel Glück beim Treiberprogrammieren.

PNoob

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. December 2010, 18:03 »
@PNoob: Deine Antwort war unter aller Würde. Es geht nicht mehr viel deutlicher auszudrücken, dass du hier gerne eine Windows-freie Zone einrichten möchtest. Echt, sowas kannst du dir klemmen. Ansonsten hat ein Dateisystemtreiber recht wenig mit diesem Thema zu tun.

Hallo,

Was möchtest du genau haben? Ein Fenster, welches einen Bildschirm simuliert und das darstellt, was du sehen würdest, wenn du einen zweiten Bildschirm an deine Grafikkarte anschließen würdest? Wenn nicht, dann erklär das mal bitte etwas genauer.

Ich kann mir nicht vorstellen, dass ein Treiber ein Fenster öffnen kann; du müsstest also eine virtuelle Grafikkarte programmieren, die in einen Speicherbereich rendert und eine API im Treiber bereitstellt, um das wieder auszulesen. Dann bräuchtest du noch ein Userspace-Programm, welches das Fenster öffnet und den Framebuffer darstellt. Einfach einen neuen virtuellen Bildschirm an die vorhandene Grafikkarte anzuschließen und dessen Inhalt im Fenster darzustellen, halte ich für nicht sinnvoll machbar. Dazu müsstest du wahrscheinlich den vorhandenen Grafikkartentreiber entsprechend erweitern; die üblichen Treiber sind kein Opensource.

Wenn es dir darum geht, Windows mal mit Multimonitoring zu testen, dann gibt es VirtualBox, der kann das.

Gruß,
Svenska

DeepDancer

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 16. December 2010, 00:03 »
Kennt keiner "GidF"???

Ums einfach zu machen - ich denke sowas suchst Du?
http://virt-dimension.sourceforge.net/

Zur Treiberprogrammierung:
Das is nicht mal eben mit paar Forenbeiträgen gelernt, da wirst Du sehr viel Zeit investieren müssen. Ich kann Dir als Stickwort mal das Driver Development Kit von MS ans Herz legen... was besseres fällt mir da auch grad ned ein, is ne Weile her als wir das letztemal sowas machen wollten *gg*

Und @PNoob: Deine Beiträge sind nur noch anmasend und wirklich unverschämt!
Du mäkelst hier an allem rum und meinst bei jeder Kleinigkeit die Welt müsse sich um Dich drehen...
Das wird langsam echt peinlich  :-o
« Letzte Änderung: 16. December 2010, 00:08 von DeepDancer »

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 16. December 2010, 00:04 »
Worum es mir geht:

Angenommen ich habe 1 Monitor an meinem PC angeschlossen. Wenn ich jetzt mit der Maus ganz rechts an den Desktop/Bildschirmrand gehe, dann geht es dort nicht mehr weiter. Ist ja auch logisch bzw. sinnvoll.

Für ein bestimmtes Usermode-Programm von mir wäre es allerdings praktisch bzw. eigentlich sogar notwendig, dass es da (z.B.) rechts "weiter geht". Und zwar ohne dass dort ein weiterer physischer Monitor angeschlossen ist.

So gesehen, soll sich der virtuelle Monitor genauso verhalten als würde ich jetzt einen 2. Monitor an meinen PC anschließen und den Desktop so auf einer Seite erweitern. Nur mit dem Unterschied, dass der Benutzer vor dem PC davon nichts sieht, weil dieser Monitor eben nicht tatsächlich existiert.

Sicherlich wäre es schön wenn man das auf dem virtuellen Monitor (theoretisch) Sichtbare dann über den Treiber bzw. in einer DLL gekapselt in einem User-Mode Programm (Fenster/Panel/WasAuchImmer) darstellen könnte. Aber ich denke das wäre dann wahrscheinlich auch nicht so das Problem.
Allerdings wäre das auch nicht so wichtig und kein Must-Have.

Hoffe ich konnte das halbwegs verständlich erklären.
« Letzte Änderung: 16. December 2010, 00:09 von Cjreek »
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 16. December 2010, 11:20 »
Achso, das kannst du mit dem nVidia-Treiber simulieren. Du musst dazu die Funktion "TV-Ausgang erzwingen" einschalten, d.h. dem Treiber mitteilen, dass du einen Fernseher mittels S-Video/FBAS angeschlossen hast, dein Treiber den aber nicht sieht.

Dann startest du dein System neu und hast einen Fernseher am TV-Out, der deinen Desktop erweitert - wenn du dort keinen Fernseher angeschlossen hast, siehst du natürlich nichts.

Eine ähnliche Funktion dürfte es bei ATI- und Intel-Grafikkarten auch geben, allerdings kenne ich solche Hardware nicht.

Hoffe, das hilft. Wenn nicht, melde dich.

Gruß,
Svenska

DeepDancer

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 16. December 2010, 11:34 »
Für ein bestimmtes Usermode-Programm von mir wäre es allerdings praktisch bzw. eigentlich sogar notwendig, dass es da (z.B.) rechts "weiter geht". Und zwar ohne dass dort ein weiterer physischer Monitor angeschlossen ist.

Reden wir denn hier jetzt über ein normals Win-Programm welches Du selber erstellt hast?

Ich versteh das nun so, dass Dir der Platz nicht ganz langt um alle Infos darzustellen auf deinem Fenster....
Wenn dem so ist, wieso nicht einen Scrollbalken unten?

Oder verpeil ich da nun grundlegend was?  :-D

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 16. December 2010, 12:58 »
@Svenska: Naja wenn ein Großteil aller Graphiktreiber das unterstützen, dann wär das ja schonmal gut. Allerdings... Ich würde das Feature gerne mit einer selbst geschriebenen Anwendung aktivieren. Ne Ahnung wie ich das machen kann? Ist halt die Frage. Vor allem schätze ich, dass ich es dann für jeden Treiber extra implementieren müsste oder?

Ansonsten wäre halt immer noch die Frage ob man sowas im Prinzip und mit vertretbarem Aufwand selbst machen kann.

Links zu Seiten über Treiberprogrammierung (unter Windows) und Foren dazu sind weiterhin auch sehr erwünscht^^


@DeepDancer: Das Problem ist NICHT mit einem Scrollbalken zu lösen  :-D Wäre ja etwas krank, wenn ich einen Treiber schreiben wollen würde für ein Problem was sich mit einem Scrollbalken lösen liese xD

Ich brauche nicht nur Platz, sondern "unsichtbaren", d.h. vom Benutzer nicht direkt wahrnehmbaren Platz. Der genaue Grund ist mal nicht so wichtig, sonst kommen wir vom Thema ab :wink:
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

DeepDancer

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 16. December 2010, 13:20 »
OK, das ist dann deutlicher :)

Aber dann leg ich Dir nochmal den Link oben ans Herz - durch sourcen lesen kann man ja auch ne menge lernen ;)

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 16. December 2010, 13:29 »
Den Link habe ich mir angeschaut. Allerdings verstehe ich den Sinn dieses Programms nicht. Hab da ein Fenster dem ich einen Hintergrund oder eine Hintergrundfarbe zuweise kann und wo alle meine geöffneten Fenster als Icon (wie in der Taskleiste nur ohne Text) aufgelistet sind.

Wenn ich auf die Icons klicke dann werden die entsprechenden Fenster in den Vordergrund gebracht.

?!

Hat soweit ich das sehe nichts mit meinem Problem (oder dessen Lösung) zu tun. Abgesehen davon, dass ich den Sinn des Programms überhaupt nicht verstehe^^
Es sei denn ich habe das Programm so wenig verstanden, dass es doch einen Sinn hat und dass es vielleicht doch eine Lösung meines Problems ist :-D
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 16. December 2010, 13:43 »
Der genaue Grund ist mal nicht so wichtig, sonst kommen wir vom Thema ab :wink:
Bei den meisten scheinbar unlösbaren Problemen, ist der Grund das wichtigste. Letztendlich ist der Grund die einzige Möglichkeit die Verhältnismäßigkeit einer Lösung zu bewerten. Ich kenne keine Software, die Dinge auf einem nicht vorhandenen Bildschirm darstellen muss.
« Letzte Änderung: 16. December 2010, 13:47 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 16. December 2010, 13:58 »
OK...

Also. Es soll ein Programm werden was beliebige Fenster skaliert.
Z.B. von 100x100 auf 200x200. Der Inhalt wird dann (als wäre es ein Bild) entsprechend gestrecht. So wie bei der Bildschirmlupe. Nur eben, dass das Fenster natürlich dann in diesem Zustand auch bedienbar sein soll.

Das eigentliche Fenster tatsächlich zu skalieren ist kaum machbar. Aus vielen Gründen. Allein weil man eben alle Controls entsprechend vergrößern müsste, was schonmal bei Controls ohne Handle fehlschlägt.

Mein zweiter Ansatz war das Zielfenster per StretchBlt auf mein eigenes zu zeichnen und alle Maus- & Tastatureingaben auf das Originalfenster umzuleiten. Das hat in Ansätzen funktioniert, war aber irgendwie nicht zufriedenstellend.

Mein momentaner Stand ist, dass ich wie bei Version 2 das Zielfenster per StretchBlt auf mein Fenster zeichne. Allerdings wird der Input nicht weitergeleitet, sondern der ich Zeichne zusätzlich noch die Maus auf mein Formular. Die Maus selbst ist allerdings immernoch beim Originalfenster. Der Benutzer hat so den Eindruck, dass das Fenster vergrößert wurde und er dieses auch bedienen kann.

Das einzige Problem bei dieser Sache ist, dass das Original-Fenster sichtbar (!) und nicht minimiert bzw. von einem anderen Fenster überdeckt sein darf. Ich würde das Orignal-Fenster am liebsten außerhalb des sichtbaren Desktop-Bereichs schieben, aber dann kommt die Maus nicht mehr dran.
Also hatte ich die Idee, dass ich die Original-Fenster auf eine Art virtuellen Monitor verschiebe auf dem der Benutzer das Original-Fenster nicht sieht, aber wo die Maus trotzdem hin kann und mein Programm auch weiterhin funktioniert.

Wenn ihr jetzt sagt: "Das ist ja alles nur blödes rumgepfusche!".. dann habt ihr Recht. So 100%ig schön & elegant ist auch mein momentaner Ansatz nicht. Auch nicht wenn ich den virtuellen Monitor hinbekäme. Aber soweit ich das Überblicke gibt es einfach keine (andere) schöne Lösung für dieses Problem. Zumindest bin ich mit meinem Latein am Ende.

Wenn irgendjemand von euch eine alternative/bessere/schönere Lösung hat, dann immer her damit!

PS: Ich bin mir nicht 100%ig sicher, ob man verstehen konnte was ich da vor hab^^ Wenn Bedarf besteht, kann ich mal ein kleines Demo-Programm hochladen. Ist dann aber nur hingerotzt, weil ich momentan einfach nur auf der Suche nach einer guten Lösung bin. Die saubere Umsetzung erfolgt dann danach.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 16. December 2010, 14:41 »
Hm, vielleicht solltest du dir mal anschauen, wie VNC- bzw. RDP-Server unter Windows funktionieren. Was die benutzen, müsste doch der richtige Ansatzpunkt für dich sein, oder?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 16. December 2010, 14:43 »
Also die Lösung dafür ist schon allein darum hässlich, weil du mit "Maus nach oben rechts werfen" nicht mehr das X in der Titelleiste triffst. Das tötet den Durchschnittsuser, weil der die Maus nicht mehr findet und außerdem weiß er nicht, woher das Problem kommt. Tu es nicht.

Ich würde wahrscheinlich benutzerdefinierte Timings vorschlagen, die einfach die Auflösung in beide Richtungen halbieren. Wenn man das geschickt macht, dann kann das jeder Monitor darstellen (z.B. 1920x1080 wird zu 960x540 bei identischem Timing). Allerdings ist das wieder ein Rumgepfusche am Grafiktreiber, setzt Adminrechte voraus und ist für den normalen Benutzer nicht machbar...

Ansonsten gibt es für mich nur zwei Möglichkeiten, den Desktop zu erweitern... (a) mehrere Bildschirme an einer Grafikkarte (b) mehrere Bildschirme an mehreren Grafikkarten.

Da eine Grafikkarte unter Windows von einem (und nur einem) Treiber gesteuert werden kann, ist Lösung (a) immer grafiktreiberabhängig. Mein Vorschlag funktioniert also nur bei Treibern, die das unterstützen - ich weiß es bei nVidia-Karten. Prinzipiell sollte aber jeder einigermaßen aktuelle Treiber das unterstützen, sofern(!) die Karte ein analoges TV-Out hat. Und zum Ändern brauchst du Administratorrechte und Zugriff auf den Treiber (d.h. das Interface zum Treiber musst du auf jeden Treiber anpassen).

Lösung (b) hatte ich ganz oben geschrieben, die wird sicherlich eine Menge Aufwand nach sich ziehen...

Gruß,
Svenska

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 16. December 2010, 14:47 »
Hm... ich verstehe.

Also eine Lösung habe ich auch nicht.

Jetzt habe ich beim Spielen mit der Windows Bildschirmlupe auf "Speichern" geklickt und den Post abgesendet. Dabei wollte ich nur vorschlagen die auch mal anzugucken (insbesondere API-Imports für Inspiration ;))

Ich wollte auch die DWM-Funktionen für die Darstellung vorschlagen (statt StretchBlt), aber das ist ja auch nicht das wirkliche Problem.

Eine Idee zur Positionierung des Original-Fensters: Die vergrößerte Variante ist ja immer größer als das Original. Vielleicht kann man das dann einfach dahinter verstecken. Dann müsste es immer auf dem Desktop sein. Sieht aber optisch vielleicht nicht bei jeder Software schön aus (insbesondere welche, die immer im Vordergrund sein will)

Ansonsten würde ich auch überprüfen, ob das wirklich ein Problem ist, wenn du das Fenster einfach ganz nach rechts unten verschiebst. Die Messages musst du ja eh via SendMessage schicken, die kommen ja gar nicht mehr direkt von der Maus.
« Letzte Änderung: 16. December 2010, 14:49 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 16. December 2010, 15:12 »
Also die Lösung dafür ist schon allein darum hässlich, weil du mit "Maus nach oben rechts werfen" nicht mehr das X in der Titelleiste triffst. Das tötet den Durchschnittsuser, weil der die Maus nicht mehr findet und außerdem weiß er nicht, woher das Problem kommt. Tu es nicht.

Doch dafür habe ich eignebaut, dass die Maus an die korrekte Stelle "teleportiert" wird, wenn er den bereich des Fensters mit der Maus verlässt. Die Maus-Verwirrung bekomme ich also in den Griff.

Ich würde wahrscheinlich benutzerdefinierte Timings vorschlagen, die einfach die Auflösung in beide Richtungen halbieren. Wenn man das geschickt macht, dann kann das jeder Monitor darstellen (z.B. 1920x1080 wird zu 960x540 bei identischem Timing). Allerdings ist das wieder ein Rumgepfusche am Grafiktreiber, setzt Adminrechte voraus und ist für den normalen Benutzer nicht machbar...

Problem ist, dass ja nur einzelne Fenster skaliert werden sollen und nicht die komplette Anzeige.

Ansonsten gibt es für mich nur zwei Möglichkeiten, den Desktop zu erweitern... (a) mehrere Bildschirme an einer Grafikkarte (b) mehrere Bildschirme an mehreren Grafikkarten.

Naja ich kann demjenigen der mein Programm nutzen will nicht sagen: "Bitte kauf dir noch einen weiteren Bildschirm, aber schalte ihn nicht an, weil du sollst nicht sehen was mein Programm da für Sachen macht."  :-D

Jetzt habe ich beim Spielen mit der Windows Bildschirmlupe auf "Speichern" geklickt und den Post abgesendet. Dabei wollte ich nur vorschlagen die auch mal anzugucken (insbesondere API-Imports für Inspiration ;))

Naja für die Bildschirmlupe braucht man ja nicht viel mehr als StretchBlt o.ä. Man kann ja nur "gucken" und kann die vergrößerten Teile ja nicht bedienen. (Man hat ja schon die Lupe "in der Hand" ^^)

Ich wollte auch die DWM-Funktionen für die Darstellung vorschlagen (statt StretchBlt), aber das ist ja auch nicht das wirkliche Problem.

Jo könnte ich mir mal anschauen, aber das ist ja wie gesagt eher nebensächlich und kein wirkliches Problem.

Eine Idee zur Positionierung des Original-Fensters: Die vergrößerte Variante ist ja immer größer als das Original. Vielleicht kann man das dann einfach dahinter verstecken. Dann müsste es immer auf dem Desktop sein. Sieht aber optisch vielleicht nicht bei jeder Software schön aus (insbesondere welche, die immer im Vordergrund sein will)

Ansonsten würde ich auch überprüfen, ob das wirklich ein Problem ist, wenn du das Fenster einfach ganz nach rechts unten verschiebst. Die Messages musst du ja eh via SendMessage schicken, die kommen ja gar nicht mehr direkt von der Maus.

Du scheinst mein Prinzip nicht 100%ig verstanden zu haben. Die Weiterleitung von Messages an das Originalfenster fällt weg, weil es unter anderem eben auch Controls gibt die keine Handles besitzen. Um mal 1 Hürde genannt zu haben...
Momentan ist es also so, dass der benutzer TATSÄCHLICH das Originalfenster bedient. Mit seinen original Maus- und Tastatureingaben. Alles was ich mache ist momentan, dass mein Programm die ganze "Szene" vergrößert darstellt. Und zwar inklusive Mauszeiger. D.h. wenn der Benutzer jetzt auf mein "Video" guckt, dann sieht es (nur) so aus, als würde er eine größere Version davon bedienen. Aber das reicht ja auch aus. Und jegliche Verwirrungen bzgl der Maus (die ja in Wirklichkeit nicht da ist, wo mein Programm es vortäuscht) werden durch ein paar Abfragen und "Tricks" verhindert.

(wobei ich in meiner aktuellen Demo nur grob einige Sachen abfange.. Ist ja nur zum Testen und wäre auch nicht mein Hauptproblem).

Im Klartext heißt das: Ich kann mein Original-Fenster nicht unter meinem skalierten verstecken, weils dann nicht mehr funktioniert.... (weswegen das halt z.B. auch alles etwas hässlich ist -.-)
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

DeepDancer

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 16. December 2010, 15:54 »
Welches Control soll denn bitte kein Handle haben?


Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 16. December 2010, 16:02 »
Genug. Controls in Java-Anwendungen haben soweit ich weiß prinzipiell keine Handles. Dann bin ich ja Pascal/Delphi Programmierer... TImage und TLabel haben z.B. auch beide keine Handles. Aber das sind nur mal 2. Alle Controls in Delphi die von TGraphicControl abgeleitet sind besitzen kein Handle. Etc. Also die Liste ist beliebig lang.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

DeepDancer

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 16. December 2010, 16:22 »
oh du hast recht... ich bin wohl etwas sehr eingerostet... *seufz*

Also so ne Funktion wie Du sie bauen willst gibt es ich glaub ab Vista ja eigentlich schon fest eingebaut - oder?

Zitat
Mit Windows Vista kann man den Inhalt von einem Fenster sehr einfach vergrößern, falls man etwas schlecht lesen kann. Hierzu einfach den Mauszeiger in das Fenster bewegen, die STRG Taste drücken und scrollen. Je nachdem, wie man dreht, wird der Inhalt vergrößert oder verkleinert.

Willst Du denn das nachbauen?  :-)

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 16. December 2010, 16:32 »
Öh. Also bei mir funktioniert das so nicht. Auf keinen Fall für jedes beliebige Fenster.
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

 

Einloggen