Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    C - WIN32 - Controllo della finestra

    Salve.
    Ho scritto un'applicazione che fa varie cose, ma tra le altre che mi mancano, ci sarebbe prendere il controllo di una mia stessa finestra.
    Il punto è che questa viene aperta in posizione e risoluzione veramente inaccettabile, così pensavo di prenderne il controllo e spostarla/aprirla come volevo. Questa funzione sembra essere fatta da SetWindowPos, ma richiede ovviamente un HWND.

    L'HWND posso prenderlo con FindWindow, ma sinceramente non mi va di fare una ricerca tramite il titolo della finestra.

    Cosi avevo pensato, se stesso dal mio programma avvio il software in questione, è possibile poi da li prendere un riferimento HWND sicuro?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    Non ho capito bene ... l'handle che vuoi ottenere e' quello della finestra della tua stessa applicazione?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    No chiedo scusa ho scritto male.
    La finestra interessata non è di mia creazione.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Dovrebbe essere proprio quello che cerco, grazie!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Avrei un'altro problema.
    Il codice è ottimo, ma usa la funzione Shell di Visual Basic che restituisce un long.
    Ho cercato, ma non mi sembra di aver trovato nessuna funzione analoga a quest'ultima.
    Avevo pensato di passare l'HINSTANCE restituito da ShellExecute per trovare l'id, ma non credo sia la soluzione giusta!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Ok ho risolto creando a mano il processo con CreateProcess, ma qualcosa non va.

    La finestra che voglio aprire, purtroppo, non sembra funzionare.
    Sto provando con un semplice notepad per vedere come spostare la posizione:

    codice:
    	HWND desktop = GetDesktopWindow();
    	HWND childwindow;
    	DWORD ProcessID;
    	PROCESS_INFORMATION ProcInfo;
    	STARTUPINFO si;
    	unsigned int x;
    	unsigned int y;
    
    	ZeroMemory(&si,sizeof(STARTUPINFO));
    	si.cb = sizeof(STARTUPINFO);
    
    	CreateProcess(NULL,"notepad.exe",NULL,NULL,false,0,NULL,NULL,&si,&ProcInfo);
    
    	childwindow = GetWindow(desktop,GW_CHILD);
    
    	while (childwindow != NULL)
    		{
    			GetWindowThreadProcessId(childwindow,&ProcessID);
    
    				if ( ProcessID == ProcInfo.dwProcessId )
    					break;
    
    			childwindow = GetWindow(childwindow,GW_HWNDNEXT);
    		}
    
    	if (childwindow == NULL)
    		return;				//Il software non è stato aperto. Non dovrebbe mai accadere.
    
    //	CloseHandle(ProcInfo.hProcess); //Devo chiuderli??
    //	CloseHandle(ProcInfo.hThread);
    	
    	x = GetSystemMetrics(SM_CXSCREEN);
    	y = GetSystemMetrics(SM_CYSCREEN);
    
    	SetWindowPos(childwindow,HWND_TOP,0,0,x-100,y-100,SWP_SHOWWINDOW);
    Se premo sul notepad, una volta completato, appare solo una schermata nera che non funziona (il sistema non si blocca, comunque).
    Sia se chiudo o non chiudo i 2 handle (comunque da una ricerca su msdn sembra che debbano essere chiusi poichè non rappresentano il processo in se e per se, ma è solo un riferimento).

    Altra cosa strana: se vado in debug e faccio aprire il processo, ovviamente il notepad salta sul desktop avanti Visual Studio.
    Per continuare il debug ovviamente sposto la mia attenzione sulla finestra di Visual Studio e continuo a debuggare, e il tutto continua.

    Se invece avvio il programma senza debug, mi appare semplicemente il notepad e non sembra fare i suoi compiti (inutili i breakpoints: l'ultimo funzionante è sul confronto degli ID dei processi).

    La finestra, ad ogni modo, sembra ignorare anche chiamate del tipo ShowWindow e SetWindowText
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Qualcuno?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Update!!
    ho fatto un getwindow text alla child window specificata: non esce il titolo del blocco note ma

    MSCTFIME UI.
    Evidentemente prima del blocconote si apre questa finestra, e io acchiappo proprio quella.

    Lo stesso codice funziona se faccio con FindWindow e scrivo il titolo della finestra.
    Advices?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    In questi casi per capire veramente cosa sta succedendo si usa Spy++ (lo dovresti trovare tra i Platform SDK tools).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.