有些时候,我们可能需要阻止手机和电脑同步。通过调用 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键值做同样的操作,代码类似,我就不一一列举了。