代码之家  ›  专栏  ›  技术社区  ›  bruceatk

有没有方法在Windows Mobile上捕获发送密钥并让它拨特定号码?

  •  1
  • bruceatk  · 技术社区  · 16 年前

    我有一个使用紧凑框架(netcf)的Windows Mobile应用程序,我想对按下发送键的人作出响应,并让电话拨我的应用程序中选择的号码。有没有一种使用紧凑框架来捕获发送密钥的方法?我看过几篇关于捕获密钥的文章,但是我没有找到一篇包含“send”密钥的文章。

    更新 :

    我在WindowsMobile上找到一篇文章,将setWindowsHookex描述为一个未记录的API。如果是这样的话,我真的不想用它。

    SetWindowsHookEx on Windows Mobile

    在做了更多的搜索之后,我发现“发送”键在WindowsMobile语言中被称为“通话”键。然后我找到了一篇关于使用shcmbm_overridekey消息在用户按下talk键时向操作系统发送wm_热键消息的博客文章。

    Jason Fuller Blog post about using the Talk button

    博客文章和它所指向的文档看起来正是我要找的。我找不到一个有效的例子,而且我发现很多人不能让它起作用。看起来智能手机不支持vk-ttalk。我很高兴听到有人在智能手机和PocketPC手机上都有这种功能。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Shane Powell    16 年前

    我可以确认使用shcmbm_overridekey在PPC和SP设备上都有效。我已经在wm5 ppc、wm5 sp、wm6 ppc、wm6 sp上测试过了。我还没有尝试过wm6.1或wm6.5,但我认为它们在wm6工作之后就可以工作了。

    您可能还需要在通话过程中支持DTMF?

    因为我在写一个lap dll,所以我遵循了下面的页面,您可能会发现这一页面很有用: 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”(通话)键,您需要在window proc上捕获wm_热键窗口消息:

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

    要拨打电话,您需要使用“phone make call”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;
      }
    
        2
  •  2
  •   Quibblesome    16 年前

    您可以通过一个键盘钩子捕捉世界中的所有键(桌面上的ctrl+alt+del除外):

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

    您可以通过coredll.dll(而不是user32)在CE中使用这个(或其他重写之一)。

    但是,这不在.NET Compact框架中,需要P/Invoke。“免费”按键的最大乐趣是form.keypreview=true;这只会给你在窗体聚焦时被击中的键,有时在处理具有特殊键的设备时什么也没有(可能是你的“发送”键,因为我以前在Intermec设备上使用“application1”键时遇到过类似的情况)。

    不过,我相信还有一个很好的选择 OpenNETCF either already does or will very soon roll with a keyhook (通过上面的winapi调用)公开一个令人愉快的托管包装。快乐!

    如果还没有准备好的话,有大量的文章和代码可以用来演示如何通过谷歌使用它,所以在最坏的情况下,如果你执行类似的搜索,你应该能够找到一些东西。 this . 也许有点像 this ?

        3
  •  0
  •   Johann Gerell    16 年前

    不使用指定的 PhoneMakeCall ?它可用于智能手机和Windows Mobile 6专业版。

    编辑:我有点误解了这个问题。我知道你现在想 陷阱 发送事件。不过,我还是留下我的答案作为参考。

    推荐文章