Fensterposition in Registry speichern und abfragen
-
Das Problem liegt wie immer in der praktischen Umsetzung der Theorie.
Die MFC-Lösung:
AfxGetApp()->WriteProfileBinary("MainFrame", "WP", (LPBYTE)&wp, sizeof(wp));
geht in WinAPI nicht, da sowohl AfxGetApp() und WriteProfileBinary MFC-Methoden sind!
Also: Gleiche Funktionalität in WinAPI ist gesucht, am besten mit Code.
-
Also, fertigen Code gebe ich Dir nicht...
Ich gebe Dir die benötigten WinAPI-Funktionen inkl. entsprechendem Link zur MSDN...
Du brauchst:
RegCreateKeyExDer Rest liegt an Dir... die Lösung ist irgendwo da draußen...
Somit lernst Du gleich den Umgang mit der MSDN und baust Dir deinen eigenen Code zusammen, was Dich hinterher (glaube mir) sehr Stolz macht, weil DU das Programm geschrieben hast, nicht wir...
-
Danke erstmal!
Ich werde mich heute nachmittag gleich ransetzen und mich dann nochmal melden!
-
Zum Umgang mit der Registry gibt's auch was in den FAQ
-
So, das abspeichern habe ich hingekriegt, nur mit dem Auslesen klappt's noch nicht ganz. Wenn jemand nochmal einen kleinen Blick hierauf werfen würde...
HKEY hkey; RECT *newrect; ULONG lr; RegQueryValueEx(hkey,"WindowPlacement",0,REG_BINARY,(LPBYTE*)&newrect,&lr); RegCloseKey(hkey); MoveWindow(hWnd,newrect->left,newrect->top,newrect->right,newrect->bottom,TRUE);
So in etwa stelle ich mir das vor, kompilieren tut er auch, nur zur Laufzeit crasht er. Ich denke, mit den ganzen Pointern auf Buffer und so stimmt noch was nicht!?
[ Dieser Beitrag wurde am 02.07.2003 um 22:19 Uhr von Mika editiert. ]
-
1.) In hKey musst du ein gültiges Handle übergeben (Standartwert, RegOpenKey(Ex) oder RegCreateKey(Ex))
2.) Schau dir mal die Beispiele aus den FAQ an, oder schau in die MSDN-LibraryIch bin mir grad net ganz sicher (hab schon so lang nichts mehr in C bzw. WinAPI programmiert
):
RECT rcWindow; DWORD dwData = sizeof(RECT); RegQueryValueEx(hkey,"WindowPlacement",0,REG_BINARY,(BYTE*)&rcWindow,&dwData );
Und halt vorher noch den Schlüssel öffnen (siehe 1.)
[ Dieser Beitrag wurde am 02.07.2003 um 22:31 Uhr von flenders editiert. ]
-
Klasse, es geht.
Dank euch, besonders Flenders für deine Korrektur!
Korrekt sieht's also so aus:RECT rect; ULONG dwData = sizeof(RECT); RegCreateKeyEx(HKEY_CURRENT_USER,"BlaBla",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hkey,0); RegQueryValueEx(hkey,"WindowPlacement",0,0,(BYTE*)&rect,&dwData); RegCloseKey(hkey);
-
Eine Korrektur hab ich noch:
Man sollte möglichst immer nur mit den Rechten einen Schlüssel öffnen, die man auch wirklich braucht. Sonst schlagen unter Umständen (User hat nicht die Berechtigung zu Schreiben, etc.) Aufrufe fehl, obwohl man eigentlich eh nur lesen will
-
Ja, also niemals etwas mit "ALL_ACCESS" machen....
Stand schonmal vor dem Problem beim steuern/abfragen von Diensten... da hatte ich auch mit SERVICE_ALL_ACCESS den Handle geholt, was nicht funktionierte!Du solltrest das also evtl. so machen:
RegCreateKeyEx(HKEY_CURRENT_USER, "BlaBla", 0, 0, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hkey, 0);
-
... und man sollte in WM_CREATE den Rückgabewert von RegQueryValueEx(..) auf ERROR_SUCCESS prüfen.
Beim ersten Start ist noch gar kein Schlüsselwert vorhanden, und dann geht's in die Hose!