请问如何获取电话状态
请问如何获取电话状态,如来电 ,通话中,有未接来电,正常等
有什么事件来捕获吗还是通过注册表能检视到如HKEY_LOCAL_MACHINE\System\State\Phone\status但不知道获取的数值怎么用
谢谢
[解决办法]
监视注册表的方法
#include <regext.h>
#include "snapi.h"
const TCHAR c_szPhoneRegistryRootkey[] = TEXT("System\\State");
const TCHAR c_szPhoneRegistrySubkey[] = TEXT("Phone");
const TCHAR c_szPhoneSignalStrength[] = TEXT("Signal Strength");
const TCHAR c_szPhoneIncomingCallerNumber[] = TEXT("Incoming Caller Number");
const TCHAR c_szPhoneStatus[] = TEXT("Status");
#define MAX_NOTIF 3
enum NotifType
{
SignalStrength = 0,
IncomingCallerNumber,
PhoneRoaming
};
HREGNOTIFY g_hRegNotify[ MAX_NOTIF ] ;
// The call-back function for Registry Notifications.
void RegistryNotifyCallbackFunc(HREGNOTIFY hNotify, DWORD dwUserData, const PBYTE pData, const UINT cbData)
{
TCHAR szOutput[MAX_PATH];
// Identify the Notification received, based upon the User Data passed in, while registering for the notification.
switch( dwUserData )
{
case SignalStrength:
StringCchPrintf(szOutput, MAX_PATH, _T("The Signal Strength is %d"), (DWORD) *pData);
break;
case IncomingCallerNumber:
StringCchPrintf(szOutput, MAX_PATH, _T("The Incoming Caller Number is %s"), (TCHAR*)pData);
break;
case PhoneRoaming:
{
DWORD dw = 0;
// Copy the data sent to us into a local buffer.
memcpy(&dw, pData, cbData);
// Find out if the roaming status has been set by logically ANDing the data with the value 512 (the bitmask for roaming).
StringCchPrintf(szOutput, MAX_PATH, _T("The Roam Status of the Phone is %s"), ( dw & SN_PHONEROAMING_BITMASK ) == SN_PHONEROAMING_BITMASK ? _T("TRUE") : _T("FALSE") );
}
break;
default :
break;
}
OutputDebugString( szOutput );
return;
}
void RegisterForPhoneNotifications()
{
HKEY hKey;
// Let us open the registry to get a handle to the Phone Registry key.
if (S_OK == RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szPhoneRegistryRootkey, 0, KEY_QUERY_VALUE, &hKey))
{
// Since we are registering for multiple notifications, let's pass some unique User Data for each notification ( 5th param ),
// which will help us identify the notification in the Call Back.
// Let us register for Signal strength notifications.
HRESULT hr = RegistryNotifyCallback(hKey,
c_szPhoneRegistrySubkey,
c_szPhoneSignalStrength,
RegistryNotifyCallbackFunc,
SignalStrength,
NULL,
&g_hRegNotify[ SignalStrength ] );
// Let us register for Incoming Caller Number notifications.
hr = RegistryNotifyCallback(hKey,
c_szPhoneRegistrySubkey,
c_szPhoneIncomingCallerNumber,
RegistryNotifyCallbackFunc,
IncomingCallerNumber,
NULL,
&g_hRegNotify [ IncomingCallerNumber ] );
// Let us register for Roaming status change notifications.
hr = RegistryNotifyCallback(hKey,
c_szPhoneRegistrySubkey,
c_szPhoneStatus,
RegistryNotifyCallbackFunc,
PhoneRoaming,
NULL,
&g_hRegNotify [ PhoneRoaming ] );
RegCloseKey(hKey);
}
}
void CloseAllNotifications ()
{
for (int i = 0; i < MAX_NOTIF; i++)
{
RegistryCloseNotification(g_hRegNotify[i]);
}
}
[解决办法]
这三个都可以,就看你想怎么notify了:
RegistryNotifyApp
RegistryNotifyCallback
RegistryNotifyWindow
Sample:
#include <snapi.h>#define UM_PHONESTATE_NOTIFY WM_USER+1000HREGNOTIFY hNotify = NULL;LRESULT RegistryNotifyWindowProc(HWND hDlg, UINT msg, UINT wParam, LONG lParam){ LRESULT lRet = FALSE; DWORD dwStatus; switch (msg) { case WM_CREATE: RegistryNotifyWindow(SN_PHONERADIOPRESENT_ROOT, SN_PHONERADIOPRESENT_PATH, SN_PHONERADIOPRESENT_VALUE, hDlg, UM_PHONESTATE_NOTIFY, 0, NULL, &hNotify); lRet = 0; break; case UM_PHONESTATE_NOTIFY: // You can read the full location with the RegistryGetString function. RegistryGetString(SN_PHONERADIOPRESENT_ROOT, SN_PHONERADIOPRESENT_PATH, SN_PHONERADIOPRESENT_VALUE, &dwStatus); // Add your own processing statements here. if (dwStatus && SN_PHONERADIOPRESENT_BITMASK) { } else if (dwStatus && SN_PHONERADIOOFF_BITMASK) { } lRet = TRUE; break; case WM_DESTROY: RegistryCloseNotification(hNotify); lRet = 0; break; // Add your own statements for handling other messages, here. return lRet;}
[解决办法]
使用 TAPI 函数的 Notify
[解决办法]
Sorry,上面的代码贴错了。
case UM_PHONESTATE_NOTIFY:
RegistryGetDWORD(SN_PHONERADIOPRESENT_ROOT,
SN_PHONERADIOPRESENT_PATH,
SN_PHONERADIOPRESENT_VALUE,
&dwStatus);
[解决办法]
上面我的代码有点问题,修正一下
#include <snapi.h>#include <regext.h>#define UM_PHONESTATE_NOTIFY WM_USER+1000HREGNOTIFY hNotify = NULL;LRESULT RegistryNotifyWindowProc(HWND hDlg, UINT msg, UINT wParam, LONG lParam){ LRESULT lRet = FALSE; DWORD dwStatus; switch (msg) { case WM_CREATE: RegistryNotifyWindow(SN_PHONERADIOPRESENT_ROOT, SN_PHONERADIOPRESENT_PATH, SN_PHONERADIOPRESENT_VALUE, hDlg, UM_PHONESTATE_NOTIFY, 0, NULL, &hNotify); lRet = 0; break; case UM_PHONESTATE_NOTIFY: RegistryGetDWORD(SN_PHONERADIOPRESENT_ROOT, SN_PHONERADIOPRESENT_PATH, SN_PHONERADIOPRESENT_VALUE, &dwStatus); // Add your own processing statements here. if (dwStatus & SN_PHONEMISSEDCALL_BITMASK) { //有未接电话 } else if (dwStatus & SN_PHONEINCOMINGCALL_BITMASK) { //有来电 } else if (dwStatus & SN_PHONECALLTALKING_BITMASK) { //正在通话中 } else { //其它 } lRet = TRUE; break; case WM_DESTROY: RegistryCloseNotification(hNotify); lRet = 0; break; // Add your own statements for handling other messages, here. return lRet;}
[解决办法]
去参考wm 6 sdk 下面的那个RAPI sample