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