有些时候,我们可能需要阻止手机和电脑同步。通过调用ActiveSyncStop 这个API可以达到我们的要求,但是在什么时候调用它呢?
当然还是要通过CallBack来实现,这里有2个方法,一个是RegistryNotifyWindow,一个是RegistryNotifyCallback,RegistryNotifyWindow会将指定消息送到指定的窗口,RegistryNotifyCallback则是发送指定消息到自定义的CallBack函数。我们需要监视HKEY_LOCAL_MACHINE//System//State//Hardware 下的键值Cradled,他是电缆插上的一个判定值。
#define WM_CHANGE_CRDL (WM_USER+ 1000)

const WCHAR c_wszHardwareStatStore[] = L"System/State/Hardware";
const WCHAR c_wszCradled[] = L"Cradled";

BOOL m_CrdlReg;

NOTIFICATIONCONDITION nc;
nc.ctComparisonType = REG_CT_ANYCHANGE;
nc.dwMask = 0xFFFFFFFF;
nc.TargetValue.dw = 0;
hr = RegistryNotifyWindow(
HKEY_LOCAL_MACHINE,
c_wszHardwareStatStore,
c_wszCradled,
hWnd, //指定的消息接收窗口
WM_CHANGE_CRDL, //指定的自定义消息
NULL,
&nc,
&m_CrdlReg
);
下面是接收窗口的处理,这样在每次用户插上电缆的时候,都会中断同步

LRESULT CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{


switch (message)
{
case WM_CREATE:

break;

//....省略其它消息

case WM_CHANGE_CRDL:
ActiveSyncStop(); //停止通讯录等同步
SetSystemPowerState(NULL, POWER_STATE_OFF, 0); //中断数据同步
break;

default:
return ::DefWindowProc(hDlg, message, wParam, lParam);
}

return lResult;
}
通过调用RegistryCloseNotification可以关闭监听
if (m_CrdlReg)
{
RegistryCloseNotification(m_CrdlReg);
m_CrdlReg = 0;
}
初步的功能已经介绍完了,当然还可以监视HKEY_LOCAL_MACHINE//System//State//ActiveSync下的Synchronizing键值做同样的操作,代码类似,我就不一一列举了。
当然还是要通过CallBack来实现,这里有2个方法,一个是RegistryNotifyWindow,一个是RegistryNotifyCallback,RegistryNotifyWindow会将指定消息送到指定的窗口,RegistryNotifyCallback则是发送指定消息到自定义的CallBack函数。我们需要监视HKEY_LOCAL_MACHINE//System//State//Hardware 下的键值Cradled,他是电缆插上的一个判定值。







NOTIFICATIONCONDITION nc;
nc.ctComparisonType = REG_CT_ANYCHANGE;
nc.dwMask = 0xFFFFFFFF;
nc.TargetValue.dw = 0;










下面是接收窗口的处理,这样在每次用户插上电缆的时候,都会中断同步

























通过调用RegistryCloseNotification可以关闭监听





初步的功能已经介绍完了,当然还可以监视HKEY_LOCAL_MACHINE//System//State//ActiveSync下的Synchronizing键值做同样的操作,代码类似,我就不一一列举了。