größe einer applikation ändern



  • hallo!

    habe da ein problem. ich muss eine anwendung z.b. acrobat und eine zugehöriges pdf öffnen. das funktioniert ja schon, jedoch möchte ich nun auch beim öffnen schon die größe der anwendung bestimmen. die anwendung wird von einem konsolenprogramm aufgrerufen, welche nur die anwendung öffnet und die größe sowie die position der anwendeung bestimmt.
    leider funktioniert zwar der aufruf, jedoch nicht die grössenvorgabe.
    bitte um hilfe!

    --- Code ---
    char cmd_line[256];
    char * applikation = argv1;
    char * dateiname = argv2;

    sprintf(cmd_line, "\"%s\"\"%s\"", applikation, dateiname);

    memset(&stgStartupInfo, sizeof(STARTUPINFO), 0);
    stgStartupInfo.cb = sizeof(STARTUPINFO);
    stgStartupInfo.lpReserved = NULL;
    stgStartupInfo.lpDesktop = NULL;
    stgStartupInfo.lpTitle = NULL;
    stgStartupInfo.dwX = 500;
    stgStartupInfo.dwY = 500;
    stgStartupInfo.dwXSize = 500;
    stgStartupInfo.dwYSize = 500;
    stgStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
    stgStartupInfo.dwFlags = STARTF_USEPOSITION;
    stgStartupInfo.dwFlags = STARTF_USESIZE;

    CreateProcess(
    applikation,
    cmd_line,
    NULL,
    NULL,
    false,
    CREATE_DEFAULT_ERROR_MODE,
    NULL,
    NULL,
    &stgStartupInfo,
    &stgProcessInfo
    );
    -----

    danke für die hilfe!

    atnt

    😕



  • Hm,
    es liegt natürlich immer an der Anwendung selber, ob sie die empfohlene Größe ihres Fensters auch selber beachtet (was die meisten Anwendungen natürlich machen).
    Du hättest die Möglichkeit die Position des Fensters nachträglich mit
    SetWindowPos zu beeinflussen.

    Grüße Rapha



  • 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.asp

    Wenn 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.asp

    HWND 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





  • 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


Anmelden zum Antworten