Terminalserver

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Terminalserver

Beitrag von Koverhage »

An die Terminalserver Spezialisten

Habe diese Anfrage bekommen:

Hallo,

ich richte gerade einen neuen Terminalserver ein.
Wenn ich dort hkabr starte ist es immer in maximaler Größe. Egal wie groß ich das hkabr Fenster vor dem letzten Schließen eingestellt habe, beim nächsten Start ist es wieder ganz groß.
Wissen Sie woran das liegt bzw. wie man das ändern kann?

Kann mir da einer der Wissenden auf die Sprünge helfen ?
Gruß
Klaus
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Terminalserver

Beitrag von ramses »

Terminalserver sind ein wenig besonders. Wo speicherst du deine Fenstergrösse ab?
Du musst diese z.B. in einer Datenbank in einem dem Benutzer permanent zugewiesenen Verzeichnis speichern.
Die Registry ist dazu nicht geeignet.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Tom »

Ich nehme an, "HKABR" (Heizkostenabrechnung?) ist Deine Software, Klaus. Wo speichert die diese Einstellungen? Wenn sich alle Nutzer im gleichen Terminalserverkontext anmelden, zieht der TS standardmäßig seinen Desktop auf die Auflösung des Arbeitsplatzes, über den man sich anmeldet. Dadurch verändern sich natürlich auch alle Bezugsgrößen. Außerdem arbeiten möglicherweise alle im gleichen Arbeitsverzeichnis. Was vorher zum Benutzer gehörte, gehört jetzt möglicherweise allen, wenigstens teilweise. Darauf muss man achten. Wir verwenden unter solchen Bedingungen z.B. in der Registry dann ergänzende Werte/Untergruppen, weil HKCU und HKLM u.U. nicht mehr eindeutig sind.
Herzlich,
Tom
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Koverhage »

Derzeit speicher ich die nicht.

Der Programm startet ich so:

Code: Alles auswählen

aDispWorkArea := DC_GetWorkArea()           
// Höhe:734        // Oben:0
nHeight := aDispWorkArea[4] - aDispWorkArea[2]
// Breite:1024     // Links:0
nWidth  := aDispWorkArea[3] - aDispWorkArea[1]

oDialog := XbpDialog():new( AppDeskTop(), , ;
        {aDispWorkArea[1],AppDeskTop():currentSize()[2]-aDispWorkArea[4]}, ;
        {nWidth,nHeight}, , NO)

oDialog:TaskList := YES
oDialog:icon := ICON_APP
oDialog:title := "HKABR Win "+hkaversion()+space(10)+cAppData
oDialog:drawingArea:new( , ,{0,AppDeskTop():currentSize()[2]-aDispWorkArea[4]}, {nWidth,nHeight}, , NO)
Dann müsste ich ja nur die Werte
aDispWorkArea[1]
aDispWorkArea[4]
nWidth
nHeight

speichern und die verwenden oder sehe ich das falsch ?
Gruß
Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Tom »

Genau. Du ziehst im Moment das Fenster ungefähr in der verfügbaren Größe des Desktops hoch. DC_GetWorkarea() liefert Dir ja den Startpunkt x/y, die X- und die Y-Ausdehnung in der Reihenfolge x,y,X,Y. X-x ist die Breite, Y-y ist die Höhe. Warum Du da noch mit AppDeskTop:CurrentSize()[2] (entspricht Y-y) arbeitest, weiß ich nicht. nWidth und nHeight entsprechen X-x und Y-y.

Wenn jetzt ein Anwender die Fenstergröße ändert, musst Du oDialog:CurrentPos() und oDialog:CurrentSize() in diesem Moment abspeichern (CurrentPos liefert x/y, CurrentSize X/Y) und diese Werte vor dem Aufbau beim Start verwenden, statt der Rückgabe von DC_GetWorkArea(). Das Speichern schiebst Du am besten in den Resize-Callback des Dialogs (oDialog:Resize := {|aOldSize,aNewSize,o|SaveDialogSize(aNewSize)}), und dann prüfst Du beim Start, ob es diese Werte irgendwo gibt (Reg, INI, XPF, Tabelle) - und wenn ja, nimmst Du die statt der Rückgabewerte von DC_GetWorkarea().
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von brandelh »

Schau mal unter EXIT Prozedure nach, oder in der Routine die dein Programm beendet,
dort würde ich die Cur POS und SIZE in einer INI abspeichern, wobei ich 2 Arten davon habe, welche im Datenverzeichnis liegen:
1. Programm allgemein (EXE Name + INI)
2. USER INI, aus Dateiname + USERNAME + INI ... der angemeldete Benutzer (bei uns U999999 ) ist auf jeden Fall eindeutig und immer gleich.

EXIT Prozedure kann man nicht vergessen, aber da ist das Programm fast schon weg,
in der eigenen Programmende Routine kann man schöner Meldung machen ...
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Terminalserver

Beitrag von ramses »

Vor dem verwenden gespeicherter Gössen und Positionsangaben würde ich unbedingt noch prüfen ob das Fenster mit den gespeicherten Daten überhaupt auf den Schirm passt. Es ist durchaus möglich dass ein User sich plötzlich auch mit kleiner Bildschirmauflösung anmeldet.... was dann ohne prüfung der Werte evtl zu einem nicht mehr erreichbaren oder bedienbaren Fenster führen kann.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Tom »

Ja. Beim Restaurieren der Werte, die man im Resize-Callback weggespeichert hat, sollte man X und Y mit den Größenangaben in DC_GetWorkArea()[3] und [4] vergleichen.
Herzlich,
Tom
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Koverhage »

Hubert,
hatte auch erst gedacht bei Nutzer zu speichern. Leider startet das Programm (derzeit im Vollbildmodus) und erst dann meldet sich der Benutzer an.
Programm allgemein geht auch nicht das wäre ja beim TS für alle gleich.
Ich muss ein Merkmal finden, was für alle unterschiedlich ist.
Gruß
Klaus
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Martin Altmann »

Klaus,
das Merkmal hast Du doch bereits vor dem Start des Programmes - den Windowsuser!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von brandelh »

Ich meinte nicht den Nutzer, der sich an deinem Programm anmeldet, sondern den der sich an der Windows Umgebung angemeldet hat.
USERNAME ist eine Umgebungsvariable, man kann auch die API nutzen, ist aber umständlicher ;-)

Code: Alles auswählen

*-----------------------------------------------------------------------
function UserInfo()
    local cUserInfo
    cUserInfo := upper(getenv("USERNAME"))
    if empty(cUserInfo)
       cUserInfo := "USER"
    endif
return cUserInfo
*-----------------------------------------------------------------------
function UserInI(cArt)
   local cUserInIFileName := ""
   DEFAULT cArt TO "DBF"
   if ! file(dateiverz()+"USER_INI\*.*")  // ist berhaupt das Verzeichnis vorhanden ?
      CreateDir(dateiverz()+"USER_INI")
   endif
   do case
      case cArt="DBF" // hatte ich früher mal
           cUserInIFileName := dateiverz()+"USER_INI\"+UserInfo()+"_INI.DBF"
      case cArt="INI"
           cUserInIFileName := dateiverz()+"USER_INI\"+UserInfo()+".INI"
   endcase
return cUserInIFileName
* Hilfsfunktionen merken sich wo die Daten liegen, das lese ich aus der Programm.INI aus dem EXE Verzeichnis, das ist fast das einzige was dort geregelt wird (nur ein Admin kann da schreiben).

Code: Alles auswählen

*-----------------------------------------------------------------------
function HilfsTabellenVerzeichnis(cVerz)    // zur Zeit einfach durchschleusen
return   dateiverz(cVerz)
*-----------------------------------------------------------------------
function dateiverz(cDatenVerz)
   static cDatVerz := NIL
   do case
      case cDatenVerz = NIL .and. cDatVerz = NIL  // einmal init
           cDatVerz := ProgVerzeichnis()
      case ! IsNil(cDatenVerz)
           cDatVerz := cDatenVerz                 // Plausi fehlt noch
           if ! empty(cDatVerz) .and. right(cDatVerz,1) # "\"
              cDatVerz += "\"
           endif

           if substr(cDatVerz,2,2) # ":\" .and. left(cDatVerz,2) # "\\" // kein Laufwerkspfad und kein UNC angegeben,
              cDatVerz := ProgVerzeichnis()+cDatVerz  // dann ProgVerz vorstellen.
           endif
   endcase
return cDatVerz
Die INI Funktionen sind etwas abgewandelte System API Funktionen...

Code: Alles auswählen

#include "Dll.ch"
*====================== API Funktionen
DLLFUNCTION FindExecutableA( cF, cP, @cE ) USING STDCALL FROM SHELL32.DLL
DLLFUNCTION GetPrivateProfileStringA(cSection, cVar, cDefault, @cBuffer, nBufferLen, cFileName) USING STDCALL FROM KERNEL32.DLL
DLLFUNCTION WritePrivateProfileStringA(cSection, cVar, cValue, cFileName)                       USING STDCALL FROM KERNEL32.DLL
*======================
*-----------------------------------------------------------------------
Function  ProgVerzeichnis(cPath)
   static cProgVerz
   do case
      case cPath # NIL
         cProgVerz := cPath
         if right(cProgVerz,1) # "\"
            cProgVerz += "\"
         endif
      case cProgVerz = NIL
         cProgVerz := AppName(.t.)
         cProgVerz := left(cProgVerz,rat("\",cProgVerz))
   endcase
return cProgVerz

*--------------------------------------------------------------------------------------------
function GetDataIni(cSection, cVar, cDefault)
   local cDataIni := dateiverz()+"ULWIN.INI"
   if PCount() == 0    // Dateiname abfragen
      return cDataIni
   endif
   DEFAULT cSection TO "Allgemein"
   DEFAULT cVar     TO ""
   if ! file(cDataIni)
      // Vorgabewerte frs ULWIN
      SetIni("Konten","EndAbrechnung",     "4991000", cDataIni)
      SetIni("Konten","ZwischenAbrechnung","4991900", cDataIni)
      SetIni("Konten","Vorschuss",         "4991900", cDataIni)
   endif
   if ! empty(cVar)
      cDefault := GetIni(cSection, cVar, cDefault, cDataIni)
   endif
return cDefault

*--------------------------------------------------------------------------------------------
function GetProgIni(cSection, cVar, cDefault)
   static cFileName := NIL
   if empty(cFileName)
      cFileName  := AppName(.t.)
      if "." $ cFileName    // normalerweise immer !
         cFileName := left(cFileName,at(".",cFileName)-1)
      endif
      cFileName += ".INI"
   endif
return GetIni(cSection, cVar, cDefault, cFileName)
*--------------------------------------------------------------------------------------------
function SetProgIni(cSection, cVar, uValue)
   static cFileName := NIL
   if empty(cFileName)
      cFileName  := AppName(.t.)
      if "." $ cFileName    // normalerweise immer !
         cFileName := left(cFileName,at(".",cFileName)-1)
      endif
      cFileName += ".INI"
   endif
return SetIni(cSection, cVar, uValue, cFileName)
*-----------------------------------------------------------------------------------
function GetIni(cSection, cVar, cDefault, cFileName,cReturnType)
   local cReturn, cBuffer, nBufferLen, nLen, cPfad, cTmp
   IF cReturnType== NIL
      cReturnType := "C"
   else
      cReturnType := upper(left(alltrim(cReturnType),1))
   ENDIF
   nBufferLen := 32000  // lange Strings erm÷glichen
   cBuffer    := replicate(chr(0),nBufferLen+1) // ASCZZ String braucht ein chr(0) mehr.
   if "\" $ cFileName
      // Pfad wurde vorgegeben, nicht Ändern
      cPfad := ""
   else
      // cPfad := CurDrive()+":\"+CurDir() // Fehler bei UNC Namen !
      IF ! EMPTY(CurDrive())               // so nicht, danke an SATMAX
         cPfad := CurDrive()+":\"+CurDir()
      ELSE
         cPfad := CurDir()
      ENDIF
      if right(cPfad,1)#"\"
         cPfad += "\"
      endif
   endif
   if IsOEM()  // OEM -> ANSI Wandlung
      if cSection # NIL
         cSection  := ConvToAnsiCP(cSection)
      endif
      if cVar # NIL
         cVar      := ConvToAnsiCP(cVar)
      endif
      cFileName := ConvToAnsiCP(cFileName)
      cDefault  := ConvToAnsiCP(cDefault)
   endif
   // bei dieser Abfrage wird KEIN cDefault übergeben, da sonst der Default-Wert nicht gespeichert wird.
   nLen := GetPrivateProfileStringA(cSection, cVar, "",@cBuffer, nBufferLen, cPfad+cFileName)
   do case
      case nLen == -1 // Puffer war nicht lang genug, aktuell Fehlermeldung
           msgbox("GetPrivateProfileStringA() meldet -1")
           cReturn := cBuffer
      case nLen ==  0
           // kein Eintrag, ich möchte dann die INI erzeugen und den default Werte anlegen !
           SetIni(cSection, cVar, cDefault, cPfad+cFileName )
           cReturn := cDefault
      otherwise
           cReturn := left(cBuffer,nLen)
   endcase

   if IsOEM()  // OEM -> ANSI Wandlung
      cReturn := ConvToOemCP(cReturn) // ANSI -> OEM
   endif

   // Rückgabewert kann eine Variable oder eine Liste mit chr(0) Trennern sein.
   do case
      case cReturnType == "C"
           cReturn := strTran(cReturn,chr(0),CRLF)
      case cReturnType == "N"
           cReturn := val(cReturn)
      case cReturnType == "L"
           do case
              case "*"+upper(cReturn)+"*" $ "*J*JA*1*-1*.T.*T*Y*YES*"
                   cReturn := .t.
              case "*"+upper(cReturn)+"*" $ "*N*NEIN*0*.F.*F*NO*"
                   cReturn := .f.
              otherwise
                   // nichts ändern
           endcase
      case cReturnType == "A"
           cTmp := cReturn
           cReturn := {}
           do while .t.
              nLen := at(chr(0),cTmp)
              do case
                 case nLen == 0
                      if ! empty(alltrim(cTmp))
                         // nur noch normale Zeichen im Reststring
                         aadd(cReturn,cTmp)
                      endif
                      exit
                 case nLen == 1
                      // nur chr(0), abschneiden
                      cTmp := substr(cTmp,2)
                 otherwise
                      aadd(cReturn,left(cTmp,nLen-1))
                      cTmp := substr(cTmp,nLen+1)
              endcase
           enddo
   endcase
   // alte Methode verwendete chr(255) statt Blanks
   cReturn := StrTran(cReturn,chr(255)," ")

return cReturn
*-----------------------------------------------------------------------------------
function SetIni(cSection, cVar, cValue, cFileName)
   local lOK, cPfad
   if empty(cSection) .or. empty(cVar) .or. empty(cFileName)
      lOK := .f.
   else
      DEFAULT cValue TO ""
      if "\" $ cFileName
         // Pfad wurde vorgegeben, nicht õndern
         cPfad := ""
      else
         // cPfad := CurDrive()+":\"+CurDir() // Fehler bei UNC Namen !
         IF ! EMPTY(CurDrive())               // so nicht, danke an SATMAX
            cPfad := CurDrive()+":\"+CurDir()
         ELSE
            cPfad := CurDir()
         ENDIF
         if right(cPfad,1)#"\"
            cPfad += "\"
         endif
      endif
      if IsOEM()  // OEM -> ANSI Wandlung
         cSection  := ConvToAnsiCP(cSection)
         cVar      := ConvToAnsiCP(cVar)
         cFileName := ConvToAnsiCP(cFileName)
         cValue    := ConvToAnsiCP(cValue)
      endif
      lOK := (WritePrivateProfileStringA(cSection, cVar, cValue,cPfad+cFileName) # 0)
   endif
return lOK
*-----------------------------------------------------------------------------------
function GetIniSectionsListe(cFileName,cType) // Array oder String
   IF cType==NIL
      cType := "A"
   else
      cType := upper(left(alltrim(cType),1))
      if "C" # cType
         cType := "A"
      endif
   endif
return GetIni(NIL,NIL,"ERROR: GetIniSectionsListe", cFileName, cType)
*---------------------------------------------------------------------------
function IsDir(cDirName)  // keine Wildcards erwnscht
   cDirName := strTran(cDirName,"?",chr(255))
   cDirName := strTran(cDirName,"*",chr(255)+chr(255))
return File(cDirName, "D")
*--------------------------------------------------------------------------------
function IsOEM()
return ( set(_SET_CHARSET) = 1 )
*--------------------------------------------------------------------------------
function IsAnsi()
return ( set(_SET_CHARSET) = 0 )
*---------------------------------------------------------------------------------------------
function Str2Disk(cFile,cTxt)             // memowrit() fgt ein chr(26) an die Datei an, was st”rt !
   local nResult, nHandle, nByte

   nResult := 0                           // wird schon alles gut gehen ...
   nHandle := FCreate(cFile)
   if nHandle = -1
      nResult := FError()
   else
      nByte := FWrite( nHandle, cTxt )
      if len(cTxt) # nByte
         nResult := FError()
      endif
   endif
   FClose(nHandle)
return nResult
*-------------------------------------------------------------
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Tom »

Wenn das die Topologie ist, speicher und restauriert man die Werte in/aus der Registry, wo dann HKCU der Bereich der Wahl ist.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von brandelh »

das darfst du gerne tun, ich bleibe bei meinen INI Dateien :-)

PS: ich kann mir das Datenlaufwerk zuordnen und dort die INI Werte prüfen und korrigieren. Im Übrigen ist das Programm (Teile des Codes) älter als die Registry von Windows ;-)
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Koverhage »

Martin,
jetzt wo Du es sagst ;-)
Danke an Alle.
Werde mal sehen welche Art die Daten zu speichern für mich einfacher ist
Gruß
Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Tom »

@Klaus: Du hast mit DC_ReqQuery und DC_RegWrite zwei sehr simple Mechanismen zur Verfügung, um solche Werte in der Reg zu speichern bzw. dort abzuholen. Und der Registry-Bereich "HKEY_CURRENT_USER" ist immer nur für den jeweils angemeldeten Windows-Nutzer zugänglich; er gehört ihm quasi. Rechteprobleme gibt es da auch nicht. Man legt eine Wertegruppe in HKCU\Software\<Name der eigenen Software>\ScreenSize an, und darin zwei Werte "x-size" und "y-size", feddisch. Die kann man notfalls sogar von außen manipulieren, sie bleiben bei Neuinstallationen und Arbeitsverzeichniswechseln erhalten, und es macht auch noch einen guten Eindruck. :wink:
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von brandelh »

dass das so einfach ist hätte ich nicht gedacht :-)
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von Koverhage »

Tom,
danke. Mit den Funktionen arbeite ich eh schon.Dürfte also nicht ganz so schlimm werden ;-)
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Terminalserver

Beitrag von brandelh »

Ich habe von irgendwo eine REG-Klasse her gehabt, aber werde damit nicht wirklich warm ...

Egal wie, wichtig ist das prüfen der Werte auf Plausibilität !

Negatives Beispiel:

ich nutze den MED sehr gerne, im Homeoffice hängt mein Laptop rechts ... und der Hauptmonitor ist eigentlich der zweite (intern verschoben nach LINKS) ...
Wenn ich nun MED auf dem zweiten (bei mir ersten in der Mitte) schließe und später nur noch mit dem Laptop Monitor arbeite, kann ich MED zwar starten, sehe aber nix.
Bisher ist es mir nicht gelungen den wieder in die Mitte zu schieben ...
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Terminalserver

Beitrag von Werner_Bayern »

ALT-Leertaste, 1x Pfeil nach unten (Alternativ "V"), dann kannst mit den Cursortasten jedes Windows-Fenster verschieben.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten