2008-12-09 1 views
1

У меня есть приложение для Windows Mobile с использованием компактного фреймворка (NETCF), с которым я бы хотел ответить кому-то нажав клавишу отправки и набрать номер телефона, указанный в моем приложении. Есть ли способ использования компактной структуры для захвата ключа отправки? Я просмотрел несколько статей о захвате ключей, но я не нашел тот, который включает в себя клавишу «Отправить».Есть ли способ захватить ключ отправки на Windows Mobile и набрать его конкретный номер?

Update:

Я нашел статью, описывающую SetWindowsHookEx как недокументированные API на Windows Mobile. Если это так, я действительно не хочу его использовать.

SetWindowsHookEx on Windows Mobile

После выполнения большего количества поиска я обнаружил, что ключ «Отправить» называется ключ «Talk» в Windows Mobile жаргон. Затем я нашел сообщение в блоге об использовании сообщения SHCMBM_OVERRIDEKEY, чтобы сигнализировать ОС, чтобы отправить мое приложение сообщение WM_HOTKEY, когда пользователь нажимает клавишу Talk.

Jason Fuller Blog post about using the Talk button

Сообщение в блоге и в документации он указывает, кажется, как именно то, что я ищу. Я не могу найти рабочий пример, и я нахожу много людей, которые не могут заставить его работать. Также похоже, что VK_TTALK не поддерживается в SmartPhones. Мне бы очень хотелось услышать от кого-то, кто действительно работает на смартфонах и телефонах PocketPC.

ответ

2

Я могу подтвердить, что использование SHCMBM_OVERRIDEKEY работает как на устройствах PPC, так и на SP. Я тестировал его на WM5 PPC, WM5 SP, WM6 PPC, WM6 SP. Я еще не пробовал WM6.1 или WM6.5, но я вроде бы предполагаю, что они работают с тех пор, как работает WM6.

Возможно, вам также потребуется поддерживать DTMF во время разговора?

Так как я писал DLL LAP я следовал на следующей странице, которые могут оказаться полезными: LAP Implementation Issues

Эти примеры находятся в C, так что вы должны будете переводить их в C#.

Для настройки захвата ключа «говорить» для конкретного окна вам нужно сделать:

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

Вы можете включить/выключить ловушку в любое время. Чтобы включить ловушку с нее легко, как хорошо:

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

Чтобы определить, когда клавиша «Talk» нажимается вам нужно ловушку оконное сообщение WM_HOTKEY на оконную процедуру:

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

Чтобы сделать телефонный звонок вам нужно использовать «PhoneMakeCall» API:

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

для поддержки DTMF во время телефонного звонка вам необходимо отслеживать телефонный звонок, используя SNAPI (я считаю, что есть C# библиотека для Хель p вы там SystemProperty).

Настройка после начала вызова:

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

Вы перезвоните с сообщением окна вы поставляете, когда изменяется количество вызовов. Вам необходимо прочитать реестр и проверить, что количество вызовов падает до нуля. Если оно вам нужно, чтобы закрыть SNAPI ручку:

RegistryCloseNotification(phone_call_notify_handle); 

В то время как в вызове отправки сообщения приложению cprog с помощью клавиши, которая была нажата пользователем:

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

Вы можете поймать все ключи в Teh мирах (кроме CTRL + ALT + DEL на рабочий стол) с помощью keyhook:

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

Вы можете использовать это (или один из других переопределениях) в СЕ через coredll.dll (вместо user32).

Однако это не в .NET Compact Framework и требует P/Invoke. Лучшая радость от «бесплатного» ключевого пресса - Form.KeyPreview = true; и это только дает вам ключи, которые попадают, когда форма сосредоточена, и иногда ничего не имеет при работе с устройствами, которые имеют специальные клавиши (возможно, например, ваш «отправить»), поскольку у меня была аналогичная ситуация с ключом «Application1» на Intermec единица обратно).

Существует, однако, одна фантастическая альтернатива, я считаю, OpenNETCFeither already does or will very soon roll with a keyhook (через вызов WinAPI выше), демонстрируя восхитительную управляемую оболочку. Радость!

Если это еще не готово, существует множество статей и кода, которые демонстрируют, как использовать это через Google, поэтому в худшем случае вы сможете найти что-то, если выполните поиск, например, this. Возможно, что-то вроде this?

+0

Intermecs, ой. На CN3 есть маленькая лампочка, которая удваивается как нулевая цифровая клавиша, и я никогда не мог понять способ доступа к ее событию. Вы знаете, поймет ли SetWindowsHook это? – MusiGenesis 2008-12-10 00:17:49

+0

Возможно, так я закрыл клавиши приложения, чтобы поместить его в режим «киоск». Кажется, что у Intermec есть привычка выбирать нечетные коды ключей, на 730 верхняя правая клавиша «Действие» - это Enter, а затем клавиша F немного позже, Enter - внизу справа, поэтому с помощью клавиш делать разные вещи ... erm ... весело. – Quibblesome 2008-12-10 00:36:40

0

Есть ли какая-то определенная причина, по которой не используется назначенный PhoneMakeCall? Он доступен для смартфонов и до Windows Mobile 6 Professional.

Редактировать: Я немного неправильно понял вопрос. Теперь я вижу, что вы хотите ловушку отправить событие. Тем не менее, я дал свой ответ для справки.

Смежные вопросы