Я могу подтвердить, что использование 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;
}
Intermecs, ой. На CN3 есть маленькая лампочка, которая удваивается как нулевая цифровая клавиша, и я никогда не мог понять способ доступа к ее событию. Вы знаете, поймет ли SetWindowsHook это? – MusiGenesis 2008-12-10 00:17:49
Возможно, так я закрыл клавиши приложения, чтобы поместить его в режим «киоск». Кажется, что у Intermec есть привычка выбирать нечетные коды ключей, на 730 верхняя правая клавиша «Действие» - это Enter, а затем клавиша F немного позже, Enter - внизу справа, поэтому с помощью клавиш делать разные вещи ... erm ... весело. – Quibblesome 2008-12-10 00:36:40