Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problema con SetFocus (https://www.clubdelphi.com/foros/showthread.php?t=74962)

luis1980 21-07-2011 11:31:06

Problema con SetFocus
 
Hola a todos, programo en C++ Builder 2007, quiero usar la función SetFocus del API de Windows, pero el problema es que se confunde con el SetFocus del propio CodeGear. Supongo que tendré que indicarle que quiero usar la función del API de Windows poniendo delante la clase o el namespace o algo, pero no sé cual es. He probado con Windows::SetFocus pero me dice que no es miembro de Windows.
Si alguien sabe como tengo que llamar a la función gracias de antemano.

_cero_ 21-07-2011 17:41:13

Prueba con, “::SetFocus( Handle );”

luis1980 22-07-2011 09:50:32

Gracias _cero_, así no me da error, otra forma de que no me de error es llamándola desde otra función fuera del evento onclick del botón. Pero de todas formas no me funciona no sé por que, pretendo mandar a el foco a otra aplicación para mandarle unas pulsaciones de teclado, para ello obtengo el manejador de la ventana con FindWindow y luego el SetFocus, pero no hace nada, la única forma en que consigo mandarle el foco es obteniendo el manejador y luego minimizando y maximizando la ventana, pero no me parece muy elegante.
Gracias por tu respuesta.

_cero_ 22-07-2011 18:43:04

mmm tampoco estoy muy seguro de porque el set focus no funciona, supongo que necesitas hacer más con la aplicación externa (no sabría decirte que, revisa la MSDN), pero para sintetizar teclas yo uso el “keybd_event” el problema de esta función es que no manda teclas a una ventana sino a quien tiene el foco, así que lo que podrías hacer es:

1 evitar que tu aplicación reciba el foco.
2 poner darle el foco a la aplicación X.
3 usar “keybd_event” para sintetizar teclas.

Te pongo código
paso 1, esto va en el OnCreate
Código:

    long wsex=GetWindowLongPtr(Handle,GWL_EXSTYLE);
    wsex |= WS_EX_NOACTIVATE;
    SetWindowLongPtr(Handle,GWL_EXSTYLE,wsex);
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE+SWP_NOMOVE);

paso 3
Código:

    String Cadena = "LAS LETRAS MAYUSCULAS";

    for(int i = 1; i <= Cadena.Length(); i++) {
        keybd_event( Cadena[ i ], 0, 0, 0 );
        keybd_event( Cadena[ i ], 0, KEYEVENTF_KEYUP, 0 );
    }

    keybd_event( VK_RETURN, 0, 0, 0 );              //
    keybd_event( VK_RETURN, 0, KEYEVENTF_KEYUP, 0); //Mando un enter

el problema de esto es que el código que puse es lo básico de un teclado virtual, es decir el usuario enfoca la aplicación y escribe desde la nuestra (con botones), pero no sé cómo simular el enfoque, si por ahí te sale lo posteas, para saber.

luis1980 25-07-2011 10:04:33

Gracias por tus respuestas _cero_, de momento el tema del foco lo voy a dejar minizando la aplicación y maximizándola después, para salir del paso, si descubro por qué no me va el SetFocus lo postearé.

Muchas gracias.

luis1980 25-07-2011 14:24:11

Bueno he encontrado otra función que sí me va, SetForeGroundWindow(HANDLE), que me trae la ventana al frente y le da el foco. No sé que diferencias habrá entre esta función y SetFocus, pero el resultado me vale.
Saludos.


La franja horaria es GMT +2. Ahora son las 22:32:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi