天天看点

在程序中阻止Windows Mobile手机的同步功能

有些时候,我们可能需要阻止手机和电脑同步。通过调用 ActiveSyncStop 这个API可以达到我们的要求,但是在什么时候调用它呢?

当然还是要通过CallBack来实现,这里有2个方法,一个是 RegistryNotifyWindow,一个是 RegistryNotifyCallback, RegistryNotifyWindow会将指定消息送到指定的窗口, RegistryNotifyCallback则是发送指定消息到自定义的CallBack函数。我们需要监视HKEY_LOCAL_MACHINE//System//State//Hardware 下的键值Cradled,他是电缆插上的一个判定值。

在程序中阻止Windows Mobile手机的同步功能

#define  WM_CHANGE_CRDL       (WM_USER+ 1000)

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

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

在程序中阻止Windows Mobile手机的同步功能

const  WCHAR c_wszCradled[]                 =  L " Cradled " ;

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

BOOL m_CrdlReg;

在程序中阻止Windows Mobile手机的同步功能

    NOTIFICATIONCONDITION nc;

    nc.ctComparisonType = REG_CT_ANYCHANGE;

    nc.dwMask           = 0xFFFFFFFF;

    nc.TargetValue.dw   = 0;

在程序中阻止Windows Mobile手机的同步功能

hr  =  RegistryNotifyWindow(

在程序中阻止Windows Mobile手机的同步功能

                HKEY_LOCAL_MACHINE,

在程序中阻止Windows Mobile手机的同步功能

                c_wszHardwareStatStore,

在程序中阻止Windows Mobile手机的同步功能

                c_wszCradled,

在程序中阻止Windows Mobile手机的同步功能

                hWnd,     // 指定的消息接收窗口

在程序中阻止Windows Mobile手机的同步功能

                WM_CHANGE_CRDL,  // 指定的自定义消息

在程序中阻止Windows Mobile手机的同步功能

                NULL,

在程序中阻止Windows Mobile手机的同步功能

                 & nc,

在程序中阻止Windows Mobile手机的同步功能

                 & m_CrdlReg

在程序中阻止Windows Mobile手机的同步功能

                );

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

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

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

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

... {

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

    switch (message)

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

    ...{

在程序中阻止Windows Mobile手机的同步功能

    case WM_CREATE:

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

        break;

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

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

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

    case WM_CHANGE_CRDL:

在程序中阻止Windows Mobile手机的同步功能

        ActiveSyncStop(); //停止通讯录等同步

在程序中阻止Windows Mobile手机的同步功能

        SetSystemPowerState(NULL, POWER_STATE_OFF, 0);  //中断数据同步

在程序中阻止Windows Mobile手机的同步功能

    break;

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

    default:

在程序中阻止Windows Mobile手机的同步功能

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

在程序中阻止Windows Mobile手机的同步功能

    }

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

    return lResult;

在程序中阻止Windows Mobile手机的同步功能

}

在程序中阻止Windows Mobile手机的同步功能

通过调用 RegistryCloseNotification可以关闭监听

在程序中阻止Windows Mobile手机的同步功能

     if  (m_CrdlReg)

在程序中阻止Windows Mobile手机的同步功能
在程序中阻止Windows Mobile手机的同步功能

     ... {

在程序中阻止Windows Mobile手机的同步功能

        RegistryCloseNotification(m_CrdlReg);

在程序中阻止Windows Mobile手机的同步功能

        m_CrdlReg = 0;

在程序中阻止Windows Mobile手机的同步功能

    }

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

继续阅读