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));
「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を使用して通話を追跡する必要があります( SystemPropertyを支援する C# ライブラリがあると思います)。
通話開始後の設定:
#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;
}