größe einer applikation ändern
-
danke für die info!
bin leider ein c++ einsteiger und habe da jetzt das problem, wie erhalte ich einen typ vom objekt CWnd von meiner anwendung.
für einen beispielcode wäre ich sehr dankbar!danke!
atnt
-
Hm,
also,
als erstes brauchst du ein Handle auf das Fenster, von dem du die Größe ändern willst (was am schwierigsten ist). Dieses Handle bekommst du mit FindWindow:
HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName );FindWindow in der MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/findwindow.asp
Mit Visual C++ wird normalerweise ein Tool mitgeliefert, mit dem man ganz einfach den Klassennamen und den Titel eines Fensters herausbekommen kann: Spy++.
Angenommen du brauchst ein Handle auf den Windows Rechner (dir ist der Klassenname unbekannt, aber du kennst den Titel des Fensters ["Rechner"]):HWND hRechner = FindWindow( NULL /* Klassenname unbekannt */, "Rechner"); if (hRechner != NULL) { // der Windows-rechner ist gestartet, wir haben jetzt das HANDLE }Schwieriger wird es, wenn du das Handle eines Programmes willst, bei dem der Fenstertitel immer je nach dem geöffneten Dokument variiert (z.B. IE: "C/C++ Forum :: Antwort schreiben - Microsoft Internet Explorer).
Hier musst du jedes geöffnetes Fenster durchgehen und in dem Titel des Fensters nach einer Zeichenfolge, die das Fenster eindeutig identifiziert (in meinem Beispiel "Microsoft Internet Explorer") suchen.
Hierfür gibt es die Funktion EnumWindows:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/enumwindows.aspWenn du das Handle hast, kannst du ganz einfach mit SetWindowPos die Position des Fensters ändern:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/SetWindowPos.aspHWND hHandle; /* Handlefindecode :) hier */ SetWindowPos(hHandle, NULL, 0, 0, 200, 180, SWP_NOOWNERZORDER | SWP_NOZORDER);Grüße Rapha
-
danke!
habe es ausprobiert, der name ist mir normalerweise bekannt z.b. ""Microsoft Excel - 4711" wie in meinem beispiel. den namen habe ich auch in spy++ gefunden.
jedoch habe ich da sicher noch einen fehler gemacht, da der compiler einen fehler meldet.--- code
HWND hWindow = FindWindow( NULL, "Microsoft Excel - 4711" );CWnd test;
test.SetWindowPos(
hWindow,
0, 0, 400, 500,
SWP_NOOWNERZORDER | SWP_NOZORDER
);--- fehlermeldung
'SetWindowPos' : Konvertierung des Parameters 1 von 'struct HWND__ *' in 'const class CWnd *' nicht moeglich-------------
würdest du bitte noch einen blick auf den code werfen?
danke für deine info!
gruss
atnt
-
sorry,
habe zu früh um hilfe gerufen. habe den fehler gefunden, funktioniert nun.
hast du auch eine idee, wie ich die anwendung wieder schliessen kann.danke
atnt
-
Schick ne WM_QUIT Nachricht mit SendMessage/PostMessage an das Fenster:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp
-
sorry für die späte antwort!
danke für deine info, sie hat mir sehr weitergeholfen. jetzt gibt es nur noch ein problem mit dem schliessen. hast du möglicherweise die zeit um mir ein kleines beispiel w.o. um es für mich besser verständlich zu machen, da mir die microsoft hilfe nicht wirklich klar ist.danke für deine info
gruss
atnt
-
Hi,
du hast ja das Handle (HWND) auf das Fenster, richtig?
versuche dann einfach folgendes (angenommen hWnd ist das Handle auf das Fenster):SendMessage(hWnd, WM_QUIT, NULL, NULL);Wenn das nicht funktioniert, versuche es mit PostMessage (beim InternetExplorer z.b. brauchst du PostMessage):
PostMessage(hWnd, WM_QUIT, NULL, NULL);Grüße Rapha
-
hallo,
fuktioniert leider nicht. anbei meinen code, das fenster wird schon gefunden (bildschimrausgabe gefunden), jedoch wird das fenster nicht geschlossen.--- code
while(gefunden == false)
{
HWND hWindow = FindWindow( NULL, applikationName );
//SendMessage( hWindow, WM_QUIT, NULL, NULL);
if ( PostMessage( hWindow, WM_QUIT, NULL, NULL) != NULL );
{
gefunden = true;
cout << "gefunden" << endl;
}
}
------gruss
atnt
-
Folgender Code schließt bei mir Excel (2002) erfolgreicht:
#include <iostream.h> #include <windows.h> char title[] = "Microsoft Excel - Neu Microsoft Excel-Arbeitsblatt.xls"; int main(int argc, char *argv[]) { HWND hWnd = FindWindow(NULL, title); if(hWnd) { cout << "Fenster gefunden" << endl; cout << "Fenster schließen" << endl; PostMessage(hWnd, WM_QUIT, NULL, NULL); } else cout << "Fenster nicht gefunden"<<endl; system("PAUSE"); return 0; }Grüße Rapha
-
hallo!
funktioniert nun auch bei mir, hatte einen fehler im programm. einen schönheitsfehler gibt es jedoch noch. sollte ich im excel etwas geändert haben, wird excel auch ohne "änderungen speichern - blablabla" geschlossen.
hast du noch eine idee, wie man dieses problem löst.danke für die info!
atnt