Terminalserver
Moderator: Moderatoren
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Terminalserver
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 ?
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
Klaus
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Terminalserver
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.
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
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Terminalserver
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
Tom
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Terminalserver
Derzeit speicher ich die nicht.
Der Programm startet ich so:
Dann müsste ich ja nur die Werte
aDispWorkArea[1]
aDispWorkArea[4]
nWidth
nHeight
speichern und die verwenden oder sehe ich das falsch ?
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)
aDispWorkArea[1]
aDispWorkArea[4]
nWidth
nHeight
speichern und die verwenden oder sehe ich das falsch ?
Gruß
Klaus
Klaus
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Terminalserver
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().
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
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Terminalserver
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 ...
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
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Terminalserver
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
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Terminalserver
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
Tom
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Terminalserver
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.
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
Klaus
- Martin Altmann
- Foren-Administrator
- Beiträge: 16586
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Terminalserver
Klaus,
das Merkmal hast Du doch bereits vor dem Start des Programmes - den Windowsuser!
Viele Grüße,
Martin
das Merkmal hast Du doch bereits vor dem Start des Programmes - den Windowsuser!
Viele Grüße,
Martin
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.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Terminalserver
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
* 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).
Die INI Funktionen sind etwas abgewandelte System API Funktionen...
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
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
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 frs 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 erwnscht
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() fgt 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
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Terminalserver
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
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Terminalserver
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
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
Hubert
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Terminalserver
Martin,
jetzt wo Du es sagst
Danke an Alle.
Werde mal sehen welche Art die Daten zu speichern für mich einfacher ist
jetzt wo Du es sagst
Danke an Alle.
Werde mal sehen welche Art die Daten zu speichern für mich einfacher ist
Gruß
Klaus
Klaus
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Terminalserver
@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.
Herzlich,
Tom
Tom
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Terminalserver
Tom,
danke. Mit den Funktionen arbeite ich eh schon.Dürfte also nicht ganz so schlimm werden
danke. Mit den Funktionen arbeite ich eh schon.Dürfte also nicht ganz so schlimm werden
Gruß
Klaus
Klaus
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Terminalserver
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 ...
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
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2129
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Terminalserver
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!>
Werner
<when the music is over, turn off the lights!>