¿Hay alguna forma de capturar la clave de envío en Windows Mobile y hacer que marque un número específico?

votos
1

Tengo una aplicación de Windows Mobile que usa el marco compacto (NETCF) que me gustaría responder a alguien presionando la tecla Enviar y hacer que el teléfono marque el número seleccionado en mi aplicación. ¿Hay alguna manera de usar el marco compacto para atrapar la clave de envío? He consultado varios artículos sobre la captura de claves, pero no he encontrado ninguno que incluya la tecla Enviar.

Actualización :

Encontré un artículo que describe SetWindowsHookEx como una API no documentada en Windows Mobile. Si este es el caso, realmente no quiero usarlo.

SetWindowsHookEx en Windows Mobile

Después de hacer más búsquedas descubrí que la tecla Enviar se llama la tecla Hablar en la jerga de Windows Mobile. Luego encontré una publicación de blog sobre el uso del mensaje SHCMBM_OVERRIDEKEY para indicarle al sistema operativo que envíe a mi aplicación un mensaje WM_HOTKEY cuando el usuario presiona la tecla Hablar.

Publicación del blog de Jason Fuller sobre el uso del botón Hablar

La publicación del blog y la documentación que señala parecen exactamente lo que estoy buscando. No puedo encontrar un ejemplo de trabajo y encuentro que muchas personas no pueden hacerlo funcionar. También parece que VK_TTALK no es compatible con SmartPhones. Me encantaría saber de alguien que realmente tiene esto funcionando tanto en teléfonos inteligentes como en teléfonos PocketPC.

Publicado el 09/12/2008 a las 22:57
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

Puedo confirmar que usar SHCMBM_OVERRIDEKEY funciona en dispositivos PPC y SP. Lo probé en WM5 PPC, WM5 SP, WM6 PPC, WM6 SP. Todavía no he probado WM6.1 o WM6.5, pero supongo que funcionan desde que funciona WM6.

También es posible que necesite admitir DTMF durante la llamada también?

Como estaba escribiendo un dll LAP seguí la siguiente página que puede serle útil: Problemas de implementación de LAP

Estos ejemplos están en C, por lo que deberá traducirlos a C #.

Para configurar la captura de la tecla "hablar" para una ventana específica que necesita hacer:

SendMessage(SHFindMenuBar(window_hwnd), 
            SHCMBM_OVERRIDEKEY, 
            VK_TTALK, 
            MAKELPARAM((SHMBOF_NODEFAULT|SHMBOF_NOTIFY), (SHMBOF_NODEFAULT|SHMBOF_NOTIFY));

Puede encender / apagar la trampa en cualquier momento. Para apagar la trampa también es fácil:

SendMessage(SHFindMenuBar(window_hwnd), 
            SHCMBM_OVERRIDEKEY, 
            VK_TTALK, 
            MAKELPARAM(0, (SHMBOF_NODEFAULT|SHMBOF_NOTIFY));

Para detectar cuando se presiona la tecla 'Hablar', debe atrapar el mensaje de la ventana WM_HOTKEY en el proceso de la ventana:

case WM_HOTKEY:
    switch(HIWORD(lParam))
    {
    case VK_TTALK:
        // make ph call
        break;
    }
    return TRUE;

Para hacer una llamada telefónica, debe usar la API "PhoneMakeCall":

#include <phone.h>

void MakePhoneCall(const wchar_t* number)
{
    PHONEMAKECALLINFO call;
    memset(&call, 0x0, sizeof(PHONEMAKECALLINFO));
    call.cbSize = sizeof(PHONEMAKECALLINFO);
    call.dwFlags = PMCF_DEFAULT;
    call.pszDestAddress = number;
    PhoneMakeCall(&call);
}

Para admitir DTMF durante una llamada telefónica, necesita rastrear la llamada telefónica usando SNAPI (creo que hay una biblioteca de C # que lo ayuda a usted con SystemProperty ).

Configuración después de iniciar la llamada:

  #include <snapi.h>
  RegistryNotifyWindow(SN_PHONEACTIVECALLCOUNT_ROOT, SN_PHONEACTIVECALLCOUNT_PATH, SN_PHONEACTIVECALLCOUNT_VALUE, window_hwnd, callback_window_msg_number /*e.g. WM_APP */, 0, NULL, &phone_call_notify_handle);

Se te devolverá la llamada con el mensaje de ventana que proporcionas cuando cambie el recuento de llamadas. Debe leer el registro y verificar que el conteo de llamadas caiga a cero. Si lo hace, debe cerrar el identificador de SNAPI:

RegistryCloseNotification(phone_call_notify_handle);

Mientras está en la llamada, envíe un mensaje a la aplicación cprog con la tecla presionada por el usuario:

#define WM_CPROG_SEND_VKEY_DTMF (WM_APP+3) // Sends the DTMF tone(s) through to the current call (converting from VKEY to DTMF chars)

  BOOL PhoneSendDTMF(UINT uvKey)
  {
    BOOL bRet = FALSE;
    static HWND s_hwndCProg = NULL;
    TCHAR chDTMF = MapVKeyToChar(uvKey);

    // Attempt to find the cprog window (MSCprog).
    // Try to keep this window handle cached.
    if(NULL == s_hwndCProg || !IsWindow(s_hwndCProg))
    {
      s_hwndCProg = FindWindow(TEXT("MSCprog"), NULL);
    }

    // Send WM_CPROG_SEND_VKEY_DTMF to the CProg window.
    if(NULL != s_hwndCProg)
    {
      bRet = BOOLIFY(PostMessage(s_hwndCProg,
                              WM_CPROG_SEND_VKEY_DTMF, (WPARAM)chDTMF, 0));
    }

    return bRet;
  }
Respondida el 16/02/2009 a las 20:57
fuente por usuario

votos
2

Puede capturar todas las claves en los mundos (aparte de CTRL + ALT + DEL en el escritorio) a través de un llavero:

static extern IntPtr SetWindowsHookEx (HookType hook, HookProc callback, IntPtr hMod, uint dwThreadId);

Puede usar esto (o una de las otras sustituciones) en CE a través de coredll.dll (en lugar de user32).

Sin embargo, esto no está en .NET Compact Framework y requiere una P / Invoke. La mejor alegría con el pressery de la llave "libre" es Form.KeyPreview = true; y eso solo te da las claves que se activan cuando el formulario está enfocado y a veces nada cuando se trata de dispositivos que tienen teclas especiales (posiblemente como la tecla "enviar", ya que tuve una situación similar con la tecla "Aplicación1" en un Intermec unidad hace un tiempo).

Sin embargo, hay una alternativa fantástica, creo que OpenNETCF ya lo hace o lo hará muy pronto con un llavero (a través de la llamada WinAPI anterior) que expone un encantador envoltorio administrado. ¡Alegría!

Si aún no está listo, hay una gran cantidad de artículos y códigos que demuestran cómo usar esto a través de Google, por lo que en el peor de los casos, debería encontrar algo si realiza una búsqueda como esta . Tal vez algo como esto ?

Respondida el 09/12/2008 a las 23:10
fuente por usuario

votos
0

¿Hay algún razonamiento particular detrás de no usar el PhoneMakeCall designado ? Está disponible para teléfonos inteligentes y hasta Windows Mobile 6 Professional.

Editar: Leí un poco la pregunta. Veo ahora que quería atrapar el evento Enviar. Sin embargo, dejo que mi respuesta permanezca como referencia.

Respondida el 13/02/2009 a las 09:30
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more