1

コンパクト フレームワーク (NETCF) を使用する Windows Mobile アプリケーションがあり、送信キーを押した人に応答して、アプリケーションで選択した番号に電話をダイヤルさせたいと考えています。コンパクトフレームワークを使用して送信キーをトラップする方法はありますか? キーのキャプチャに関する記事をいくつか見ましたが、「送信」キーを含む記事は見つかりませんでした。

更新

SetWindowsHookEx が Windows Mobile のドキュメント化されていない API であると説明している記事を見つけました。もしそうなら、私は本当にそれを使いたくありません。

Windows Mobile での SetWindowsHookEx

さらに検索を行った結果、「送信」キーは Windows Mobile 用語で「トーク」キーと呼ばれていることがわかりました。次に、SHCMBM_OVERRIDEKEY メッセージを使用して、ユーザーが Talk キーを押したときにアプリに WM_HOTKEY メッセージを送信するよう OS に通知することに関するブログ投稿を見つけました。

トーク ボタンの使用に関する Jason Fuller のブログ投稿

ブログ投稿とそれが指しているドキュメントは、まさに私が探しているもののようです。実際の例を見つけることができず、多くの人がそれを機能させることができません。また、スマートフォンでは VK_TTALK がサポートされていないようです。これがスマートフォンと PocketPC フォンの両方で実際に機能している人からの連絡をお待ちしています。

4

3 に答える 3

3

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;
  }
于 2009-02-16T19:57:31.240 に答える
2

キーフックを介して、世界のすべてのキーをキャッチできます (デスクトップ上の CTRL+ALT+DEL を除く):

static extern IntPtr SetWindowsHookEx(HookType フック、HookProc コールバック、IntPtr hMod、uint dwThreadId);

(user32 の代わりに) coredll.dll を介して CE でこれ (または他のオーバーライドの 1 つ) を使用できます。

ただし、これは .NET Compact Framework にはなく、P/Invoke が必要です。「無料」のキープレスで最高の喜びは Form.KeyPreview = true; です。フォームがフォーカスされているときにヒットするキーのみを提供し、特別なキーを持つデバイスを処理する場合は何も提供しません (おそらく、Intermec の「Application1」キーで同様の状況があったため、「send」キーなど)。少し前のユニット)。

ただし、素晴らしい代替手段が 1 つあります。私は、OpenNETCFが (上記の WinAPI 呼び出しを介して) キーフックを既に実行しているか、すぐに実行して、楽しいマネージド ラッパーを公開すると信じています。喜び!

まだ準備が整っていない場合は、Google 経由でこれを使用する方法を示す記事やコードがたくさん出回っているので、最悪の場合、このような検索を実行すると何かを見つけることができるはずです。おそらくこのようなものですか?

于 2008-12-09T22:10:04.480 に答える
0

指定されたPhoneMakeCallを使用しない特定の理由はありますか? スマートフォンから Windows Mobile 6 Professional まで利用できます。

編集:質問を少し読み違えました。Send イベントをトラップする必要があることがわかりました。ただし、参考までに私の答えをそのままにしておきます。

于 2009-02-13T08:30:32.270 に答える