Is er een manier om de send-toets op Windows Mobile te vangen en hebben het kiezen van een specifiek nummer?

stemmen
1

Ik heb een Windows Mobile applicatie met behulp van de Compact Framework (netcf) dat ik geef een reactie op iemand te drukken op de send-toets en laat de telefoon het gekozen in mijn aanvraag nummer. Is er een manier om met behulp van de Compact Framework te vangen op de verzendtoets? Ik heb gekeken naar een aantal artikelen over het vastleggen van sleutels, maar ik heb niet gevonden die de toets Verzenden omvat.

update :

Ik vond een artikel waarin SetWindowsHookEx als een ongedocumenteerde API op Windows Mobile. Als dit het geval is dan ik echt niet willen gebruiken.

SetWindowsHookEx op Windows Mobile

Na het doen van meer zoeken kwam ik erachter dat de sleutel Verzenden de Talk toets in Windows Mobile jargon wordt genoemd. Ik vond toen een blog post over het gebruik van de SHCMBM_OVERRIDEKEY bericht om aan te geven het OS aan mijn app een WM_HOTKEY bericht te sturen wanneer de gebruiker de Talk toets drukt.

Jason Fuller Blog post over het gebruik van de knop Talk

De blog post en de documentatie wijst op lijken precies wat ik zoek. Ik ben niet in staat om een ​​werkend voorbeeld te vinden, en ik vind een heleboel mensen niet in staat om het te laten werken. Het lijkt ook alsof VK_TTALK niet wordt ondersteund in smartphones. Ik zou graag horen van iemand die daadwerkelijk heeft deze manier van werken op zowel smartphones en PocketPC telefoons.

De vraag is gesteld op 09/12/2008 om 22:57
bron van user
In andere talen...                            


3 antwoorden

stemmen
2

Ik kan bevestigen dat het gebruik van SHCMBM_OVERRIDEKEY werkt op zowel PPC en SP-apparaten. Ik heb het op WM5 PPC, WM5 SP, WM6 PPC, WM6 SP getest. Ik heb nog niet geprobeerd WM6.1 of WM6.5 maar ik soort-van uitgaan dat ze werken sinds WM6 werkt.

Ook kan het nodig zijn om DTMF te ondersteunen tijdens het gesprek ook?

Omdat ik het schrijven van een LAP dll Ik volgde de volgende pagina die u misschien nuttig vindt: LAP Implementation Issues

Deze voorbeelden zijn in C dus je zal moeten om ze te vertalen in C #.

Voor het opstarten van de vangst van de toets "talk" voor een specifiek venster moet je doen:

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

U kunt inschakelen / uitschakelen van de val op elk gewenst moment. Om de trap af te zetten gemakkelijk ook:

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

Om te detecteren wanneer de 'Talk' toets wordt ingedrukt moet je de vangst van de WM_HOTKEY venster bericht op het venster proc:

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

Om een ​​telefoon te maken bel je nodig hebt om de API "PhoneMakeCall" te gebruiken:

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

Om DTMF ondersteunen tijdens een telefoontje je nodig hebt om het telefoongesprek met behulp van sporen SNAPI (ik geloof dat er een C # bibliotheek om u te helpen die er SystemProperty ).

Setup na de oproep starten:

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

U wordt teruggebeld met het raam bericht dat u te leveren wanneer de oproepen aantal veranderingen. U moet het register te lezen en te controleren of de oproepen aantal daalt tot nul. Als dat zo is moet je de SNAPI handvat te sluiten:

RegistryCloseNotification(phone_call_notify_handle);

Terwijl in de oproep een bericht sturen naar het cprog applicatie met de sleutel die door de gebruiker werd ingedrukt:

#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;
  }
antwoordde op 16/02/2009 om 20:57
bron van user

stemmen
2

U kunt alle sleutels in teh werelden (afgezien van CTRL + ALT + DEL op het bureaublad) via een keyhook te vangen:

statische extern IntPtr SetWindowsHookEx (HookType haak, HookProc callback, IntPtr HMOD, uint dwThreadId);

U kunt gebruik maken van deze (of één van de andere overschrijvingen) in CE via coredll.dll (in plaats van user32).

Dit is echter niet in het .NET Compact Framework en vereist een P / Invoke. De beste vreugde met "gratis" key pressery is Form.KeyPreview = true; en dat geeft u alleen de sleutels die geraakt wanneer het formulier is gericht en soms niets als het gaat om apparaten die over speciale toetsen beschikt (eventueel zoals uw "send" -toets, als ik een soortgelijke situatie met de toets "Application1" op een Intermec gehad eenheid een tijdje terug).

Er is echter een fantastisch alternatief, geloof ik OpenNETCF ofwel al doet of zullen zeer binnenkort roll met een keyhook (via de WinAPI call hierboven) het blootstellen van een heerlijk beheerd wrapper. Vreugde!

Als dat nog niet klaar is er een overvloed aan artikelen en code schoppen rond die laten zien hoe deze te gebruiken via Google, zodat in het ergste geval moet je in staat om iets te vinden als je een zoekopdracht zoals het uitvoeren van deze . Misschien iets als dit ?

antwoordde op 09/12/2008 om 23:10
bron van user

stemmen
0

Is er een bepaalde redenering achter het niet gebruiken van de aangewezen PhoneMakeCall ? Het is beschikbaar voor Smartphone en tot Windows Mobile 6 Professional.

Edit: Ik verkeerd de vraag een beetje. Ik zie nu dat je wilde vangen het verzenden evenement. Ik laat mijn antwoord blijven, hoewel, als referentie.

antwoordde op 13/02/2009 om 09:30
bron van user

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