Existe uma maneira de capturar a tecla enviar no Windows Mobile e tê-lo marcar um número específico?

votos
1

Eu tenho um aplicativo Windows Mobile usando a estrutura compacta (NETCF) que eu gostaria de responder a alguém pressionando a tecla enviar e que o telefone disque o número selecionado na minha candidatura. Existe uma maneira usando a estrutura compacta para prender a tecla enviar? Eu olhei vários artigos sobre teclas de captura, mas eu não encontrei uma que inclui a tecla Enviar.

atualização :

Eu encontrei um artigo descrevendo SetWindowsHookEx como uma API não documentada no Windows Mobile. Se este for o caso, então eu realmente não quiser usá-lo.

SetWindowsHookEx no Windows Mobile

Depois de fazer mais pesquisa eu descobri que a tecla Enviar é chamado a tecla Talk no Windows Mobile linguagem. Então eu encontrei um blog sobre como usar a mensagem SHCMBM_OVERRIDEKEY para sinalizar o OS para enviar meu aplicativo uma mensagem WM_HOTKEY quando o usuário pressiona a tecla Talk.

Jason Fuller Blog post sobre como usar o botão Falar

O post do blog ea documentação ele aponta para parecer exatamente o que estou procurando. Eu sou incapaz de encontrar um exemplo de trabalho, e eu encontrar um monte de pessoas incapazes de fazê-lo funcionar. Também parece que VK_TTALK não é suportado em smartphones. Gostaria muito de ouvir de alguém que realmente tem esse trabalho em ambos os telefones Smartphones e PocketPC.

Publicado 09/12/2008 em 22:57
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Posso confirmar que o uso SHCMBM_OVERRIDEKEY funciona em ambos os dispositivos PPC e SP. Eu testei-o em WM5 PPC, WM5 SP, WM6 PPC, WM6 SP. Eu não tentei WM6.1 ou WM6.5 ainda, mas eu meio-de supor que eles trabalham desde WM6 funciona.

Também pode ser necessário para apoiar DTMF durante a chamada assim?

Desde que eu estava escrevendo um dll LAP Segui a seguinte página que você pode achar útil: Questões LAP Implementação

Estes exemplos estão em C, assim você terá que traduzi-los em C #.

Para captura de configuração da chave "falar" para uma janela específica que você precisa fazer:

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

Você pode ativar / desativar a armadilha a qualquer momento. Para ligar a armadilha fora dela tão fácil assim:

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

Para detectar quando a tecla 'Talk' é pressionado que você precisa para interceptar a mensagem janela WM_HOTKEY no proc janela:

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

Para fazer um telefonema que você precisa usar a 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 apoiar DTMF durante uma chamada de telefone que você precisa para rastrear o telefonema usando SNAPI (Eu acredito que há um # biblioteca C para ajudá-lo lá fora SystemProperty ).

Setup depois de iniciar a chamada:

  #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);

Você vai ser chamado de volta com a mensagem janela que você fornece quando as mudanças de contagem chamada. Você precisa ler o registro e verifique se a contagem de chamadas cai para zero. Se isso acontecer você precisa fechar o identificador SNAPI:

RegistryCloseNotification(phone_call_notify_handle);

Durante a chamada enviar uma mensagem para a aplicação cprog com a chave que foi pressionado pelo usuário:

#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;
  }
Respondeu 16/02/2009 em 20:57
fonte usuário

votos
2

Você pode pegar todas as chaves em teh mundos (além de CTRL + ALT + DEL no desktop) através de uma KeyHook:

extern estática IntPtr SetWindowsHookEx (gancho HookType, HookProc chamada de retorno, IntPtr hMod, uint dwThreadId);

Você pode usar este (ou um dos outros substituições) na CE através coredll.dll (em vez de user32).

No entanto este não é no Compact Framework e requer um P / invocação. A melhor alegria com pressery chave "livre" é Form.KeyPreview = true; e que só lhe dá as chaves que são atropelados quando o formulário é focado e às vezes nada quando se trata de dispositivos que possuem teclas especiais (possivelmente tais como sua "enviar" chave, como eu tinha uma situação semelhante com a tecla "Application1" em um Intermec unidade de um tempo de volta).

Há, porém, uma alternativa fantástica, acredito OpenNETCF ou já faz ou vai muito em breve rolar com um KeyHook (através da chamada WinAPI acima) expondo um wrapper gerenciado delicioso. Alegria!

Se isso ainda não está pronto há uma abundância de artigos e código chutando em torno que demonstram como usar esta via Google assim, no pior dos casos você deve ser capaz de encontrar algo se você realizar uma pesquisa como esta . Talvez algo como isso ?

Respondeu 09/12/2008 em 23:10
fonte usuário

votos
0

Existe algum raciocínio especial para trás não usando o designado PhoneMakeCall ? Ele está disponível para Smartphone e até Windows Mobile 6 Professional.

Edit: Eu descaracterizou a pergunta um pouco. Vejo agora que você queria prender o Enviar evento. Eu deixei minha resposta ficar, no entanto, para referência.

Respondeu 13/02/2009 em 09:30
fonte usuário

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