FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Problemas con ShellExecute
Hola
Tengo un problema con ShellExecute que no se cómo pillarlo. La cuestión es que tengo que lanzar 2 app externas y posicionarlas en pantalla de forma que se vean las 2. Para hacerlo, lanzo la siguiente función 2 veces, una para cada app: Código:
HWND __fastcall TStep3::EjecApp(AnsiString aFile,bool Wait) { bool Exit = false; int MSec = 0; HWND aHandle = 0; AnsiString aTitle = ""; ShellExecute(this->Handle, "open", (TmpDir + aFile).c_str(), NULL, NULL, SW_NORMAL); if ( !Wait ) return aHandle; do { Sleep(200); MSec = MSec + 200; if (MSec >= 2000) Exit = true; aHandle = LocatedWindows(aTitle, aPartialTitle); } while ( (aHandle != 0) | Exit ); return aHandle; } Bien, la cuestión es que si le digo que no necesito handle, ShellExecute funciona siempre, pero si le digo que me lo devuelva (para poder posicionar una ventana lo necesito para la función SetWindowPos) ShellExecute deja de funciuonar hasta reiniciar el programa. Está claro que el error está en esta función, pero no llego a alcanzar a ver el por qué. Os pongo la función: Código:
HWND __fastcall TStep3::LocatedWindows(AnsiString aTitle) { HWND nHwnd = 0; HWND nInitHwnd = 0; HWND nCurrWnd = 0; int nLength = 0; char * aTitulo = ""; nHwnd = GetDesktopWindow(); nInitHwnd = GetWindow( nHwnd, GW_CHILD ); nCurrWnd = GetWindow( nInitHwnd, GW_HWNDFIRST ); while ( nCurrWnd != 0 ) { nLength = GetWindowTextLength(nCurrWnd); if (nLength > 0) { GetWindowText(nCurrWnd, aTitulo, 255); if ( UpperCase(aTitulo) == UpperCase(aTitle) ) return nCurrWnd; } nCurrWnd = GetWindow( nCurrWnd, GW_HWNDNEXT ); } return 0; } Alguna idea? Gracias |
#2
|
||||
|
||||
Lo que no comprendo es como puedes llamar a una funcion con 2 argumentos, habiendo sido declarada solo con uno (LocatedWindows)! te dejo un ejemplo un poco distinto y un poco mas "correcto", pues GetWindow te puede retornar el manejador de una insancia anteriormente creada de la misma aplicacion.
Código:
int __stdcall EnumProc(void * hWnd, long lParam) { if (IsWindowVisible(hWnd)) // aquí puedes realizar tu comparación si es el caso SetWindowPos(hWnd, HWND_TOPMOST, lParam, 0, 0, 0, SWP_NOSIZE); return TRUE; } void Exec(AnsiString CommandLine, long Left) { STARTUPINFO si = {sizeof si}; PROCESS_INFORMATION pi; CreateProcessA(NULL, CommandLine.c_str(), NULL, NULL, 0, 0, NULL, NULL, &si, &pi); WaitForInputIdle(pi.hProcess, INFINITE); EnumThreadWindows(pi.dwThreadId, (int (__stdcall *)())EnumProc, Left); } void __fastcall TForm1::Button1Click(TObject *Sender) { Exec("c:\\windows\\notepad.exe", 0); Exec("c:\\windows\\notepad.exe", 500); } |
#3
|
|||
|
|||
Hola
Cita:
Me limité a hacer una limpieza de las funciones para quitar el código que no tenía nada que ver con el problema y se me pasó quitar ese parámetro Referente al código que me planteas..... Si entiendo bien la ayuda del MSDN, EnumThreadWindows te ejecutará una función callback tantas veces como ventanas no-hijas tenga la aplicación lanzada o creada mediante CreateProcessA, ¿es eso correcto? Y la función WaitForInputIdle espera a que la aplicación lanzada esté totalmente cargada (o al menos la ventana principal), ¿también es esto correcto? Si es así, tu solución la veo, no se si mejor o peor, pero sí más "limpia" Gracias por la respuesta |
#4
|
||||
|
||||
Cita:
Cita:
Cita:
en busca de un texto en su título o su clase, pero pueden existir N instancias de una aplicacion y por ende N ventanas de la misma clase y muy probablemente tambien con el mismo título. Entonces no hay forma de asegurar mediante GetWindow, FindWindow o parecidos, que la instancia encontrada sea la que tu creaste. Es por ello que uso y aconsejo usar CreateProcess pues retorna los identificacodres del proceso e hilo principal (y en algunas ocaciones ShellExecuteEx pues tambien retorna informacion propia del proceso creado.) You are Welcome |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problemas con ShellExecute | ZayDun | Varios | 4 | 27-03-2008 22:33:47 |
Shellexecute | mjjj | Varios | 2 | 11-09-2007 17:41:21 |
ShellExecute | jorodgar | Varios | 8 | 07-05-2007 13:46:15 |
Problemas con ShellExecute y Java. | tryasta | API de Windows | 2 | 05-09-2005 19:09:41 |
Problemas con ShellExecute: | lalo | Varios | 2 | 18-03-2005 15:04:52 |
|