我可以确认使用 SHCMBM_OVERRIDEKEY 在 PPC 和 SP 设备上都有效。我已经在 WM5 PPC、WM5 SP、WM6 PPC、WM6 SP 上对其进行了测试。我还没有尝试过 WM6.1 或 WM6.5,但我有点假设它们可以工作,因为 WM6 工作。
另外,您可能还需要在通话期间支持 DTMF 吗?
由于我正在编写 LAP dll,因此我遵循了以下页面,您可能会发现它很有用:
LAP 实施问题
这些示例是用 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));
要检测何时按下“谈话”键,您需要在窗口 proc 上捕获 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# 库可以帮助您解决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;
}