就是说要求能在(启用)禁用时可以选择是(启用)禁用无线网卡还是有线网卡
急救!!

解决方案 »

  1.   

    #include "stdafx.h" 
    #include  <tchar.h>          
    #include  <windows.h>      
    #include  <setupapi.h> #pragma comment (lib,"setupapi") #define UnknownDevice TEXT("") HDEVINFO hDevInfo = 0; 
    BOOL StateChange(DWORD NewState, DWORD SelectedItem,HDEVINFO hDevInfo) 

    SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)}; 
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; 
    HCURSOR hCursor; // 
    // This may take a while :^( 
    // 
    hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); // 
    // Get a handle to the Selected Item. 
    // 
    if (!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData)) 

    printf("EnumDeviceInfo"); 
    return FALSE; 
    } // 
    // Set the PropChangeParams structure. 
    // 
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; 
    PropChangeParams.Scope = DICS_FLAG_GLOBAL; 
    PropChangeParams.StateChange = NewState; if (!SetupDiSetClassInstallParams(hDevInfo, 
    &DeviceInfoData, 
    (SP_CLASSINSTALL_HEADER *)&PropChangeParams, 
    sizeof(PropChangeParams))) 

    printf("SetClassInstallParams"); 
    SetCursor(hCursor); 
    return FALSE; 
    } // 
    // Call the ClassInstaller and perform the change. 
    // 
    if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, 
    hDevInfo, 
    &DeviceInfoData)) 

    printf("SetClassInstallParams"); 
    SetCursor(hCursor); 
    return TRUE; 
    } SetCursor(hCursor); 
    return TRUE; 

    BOOL IsClassNet( GUID * ClassGuid ) 

    #define MAX_NUM 50 HKEY hKeyClass; 
    LONG lRet; 
    char ClassType[MAX_NUM]; 
    char NetClass[MAX_NUM] = "Net"; 
    DWORD dwLength = MAX_NUM,dwType = REG_SZ; if (hKeyClass = SetupDiOpenClassRegKey(ClassGuid,KEY_READ)) 

    lRet = RegQueryValueEx(hKeyClass, 
    TEXT("Class"), 
    NULL, &dwType, LPBYTE(ClassType), &dwLength); 
    RegCloseKey(hKeyClass); if (lRet != ERROR_SUCCESS) 
    return FALSE; if (!strcmp(ClassType,NetClass)) 
    return TRUE; 
    } return FALSE; 
    } int main(int argc, char* argv[]) 

    if (INVALID_HANDLE_VALUE == (hDevInfo = 
    SetupDiGetClassDevs(NULL,NULL,0, 
    DIGCF_PRESENT |DIGCF_ALLCLASSES))) 

    printf("GetClassDevs"); 
    return 0; 
    } DWORD i, Status, Problem; 
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; HKEY hKeyClass; 
    char DeviceName[200]; 
    for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++) 

    if (IsClassNet(&DeviceInfoData.ClassGuid)) 

    printf(" the class's index is %d\n",i); 
    // 
    //DICS_DISABLE-->禁用网络 
    //DICS_ENABLE--->恢复网络 
    // 
    if (StateChange(DICS_ENABLE,i,hDevInfo)) 
    printf("NetWork stopped"); } 
    } return 0; 
    } //转的,没有测试。禁用无线和禁用有线网卡没有区别。程序中有段读取设备列表的代码,将这段代码获得的设备写入combo让用户选择,是否可以?
      

  2.   

    lfchen 
    你的方法好像禁用了所有网卡
    如果禁用所有网卡的话可以根据GUID,不用枚举所有的设备,档主的意思是想禁用无线网卡或普能的网卡其中一种是吧,如果楼主想到了思路或找到答案请告诉我一下,我也想知道怎么做
      

  3.   

    通过WMI class Win32_NetworkAdapter.Disable method.
      

  4.   

    subtype为硬件的hardwareId
    这样你就可以开启禁用任何硬件了~`
    BOOL SetDevStates(bool states,LPTSTR subtype)
    {
    DWORD NewState;
    if(states)   
    {   
    NewState=DICS_DISABLE;   
    //禁用   
    }   
    else     
    {   
    NewState=DICS_ENABLE;   
    //启用   
    }    DWORD i,err;   
    BOOL Found=FALSE;   
    HDEVINFO hDevInfo;   
    SP_DEVINFO_DATA spDevInfoData;   
                 //访问系统的硬件库   
    hDevInfo=SetupDiGetClassDevs(NULL,NULL ,NULL,DIGCF_ALLCLASSES|DIGCF_PRESENT);
    if(hDevInfo==INVALID_HANDLE_VALUE)   
    {   
    MessageBox(_T("访问系统硬件出错!"));   
    return FALSE;   
    }   
                
    //枚举硬件,获得需要的接口   
    spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);   
    BOOL flagEnum;   
    for(i=0;flagEnum = SetupDiEnumDeviceInfo(hDevInfo,i,&spDevInfoData);i++)   
    {   
    DWORD DataT;   
    CHAR buffer[500]={0};   
    DWORD buffersize=0;   
                        
    //获得硬件的属性值   
    buffersize   =   sizeof(buffer);   
    while(!SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)buffer, buffersize,  &buffersize))   
    {
    DWORD a = GetLastError();   
    if(GetLastError()==ERROR_INVALID_DATA)   
    {   
    //不存在HardwareID.   Continue.   
    break;   
    }   
    else if(GetLastError()==ERROR_INSUFFICIENT_BUFFER)   
    {   
    //buffer   size不对.   
    if(buffer) 
    {
    LocalFree(buffer);   
    //buffer=(char*)LocalAlloc(LPTR,buffersize);   
    }   
    else     
    {   
    //未知错误   
    //退出时,清理工作环境
    err=GetLastError();   
    SetupDiDestroyDeviceInfoList(hDevInfo);   
    SetLastError(err);       
    return   FALSE;   
    }

                        
    if(GetLastError()==ERROR_INVALID_DATA)   
    continue;   
                        
    if(NULL   ==   buffer)   
    {
    // LocalFree(buffer);   
    continue;   
    }
    }
    //MessageBox((LPCWSTR)buffer);
    if(StrStr((LPCWSTR)buffer,subtype) != NULL)
    {
    //MessageBox((LPCWSTR)buffer);
    DWORD pSize=0;
    SP_PROPCHANGE_PARAMS spPropChangeParams;                              
    spPropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);   
    spPropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;   
    spPropChangeParams.Scope=DICS_FLAG_GLOBAL;   //DICS_FLAG_CONFIGSPECIFIC //DICS_FLAG_GLOBAL
    spPropChangeParams.StateChange=NewState;   
    //禁用:DICS_DISABLE,DICS_ENABLE启用   
    if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))   
    {
    DWORD errorcode=GetLastError();
    }             
    if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))   
    {
    DWORD errorcode=GetLastError();   
    }
    }
    }         
    //退出时,清理工作环境    
     
    err=GetLastError();   
    SetupDiDestroyDeviceInfoList(hDevInfo);   
    SetLastError(err);       
    return   TRUE;
    }
      

  5.   

    我已经找到了方法.
    首先和普通的方法一样,根据GUID禁用网卡类设备,只是在禁用时枚举第i块网卡,读取其设备信息,读到有"wireless"这个串的就认为它是无线网卡,就对它使用禁用操作,否则就接着枚举第i+1块网卡,直到都枚举完.
    下面给出重要结构.
    // driveDemoDlg.cpp : implementation file
    #include "stdafx.h"
    #include "driveDemo.h"
    #include "driveDemoDlg.h"
    #include < windows.h >
    #include < wincon.h >
    #include < stdlib.h >
    #include < stdio.h >
    #include <string.h>
    HDEVINFO hDevInfo = NULL;
    class CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();
    enum { IDD = IDD_ABOUTBOX };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    protected:
    DECLARE_MESSAGE_MAP()};
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {}
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {CDialog::DoDataExchange(pDX);}
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    CDriveDemoDlg::CDriveDemoDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CDriveDemoDlg::IDD, pParent)
    {m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}
    void CDriveDemoDlg::DoDataExchange(CDataExchange* pDX)
    {CDialog::DoDataExchange(pDX);}
    BEGIN_MESSAGE_MAP(CDriveDemoDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON_SEARIALPORT1, OnButtonSearialport1)
    ON_BN_CLICKED(IDC_BUTTON_SEARIALPORT2, OnButtonSearialport2)
    END_MESSAGE_MAP()
    // CDriveDemoDlg message handlers
    BOOL CDriveDemoDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
            ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon

    return TRUE;  // return TRUE  unless you set the focus to a control
    }void CDriveDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }
    void CDriveDemoDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }HCURSOR CDriveDemoDlg::OnQueryDragIcon()
    {
    return (HCURSOR) m_hIcon;
    }void CDriveDemoDlg::OnOK() 
    {
    CDialog::OnOK();
    }void CDriveDemoDlg::FormatMSG(DWORD dwError, LPTSTR * lpszMsg)
    {
    BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,
    MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), (LPTSTR)lpszMsg, 0, NULL); if (!bOk)
    {
    HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),
    NULL,
    DONT_RESOLVE_DLL_REFERENCES);
    if (NULL != hDll)
    {
    FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | 
    FORMAT_MESSAGE_FROM_SYSTEM,
    hDll,
    dwError,
    MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
    (LPTSTR)lpszMsg,0, NULL);
    FreeLibrary(hDll);
    }
    }
    }//////ChangeStatus
    BOOL CDriveDemoDlg::ChangeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)
    {
    LPTSTR lpszMsg = NULL;
    HCURSOR hCursor = NULL;
    try
    {
    SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};  hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); // Get a handle to the Selected Item.
    if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
    {
    FormatMSG(GetLastError(), &lpszMsg);
    throw lpszMsg;
    } // Set the PropChangeParams structure.
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    PropChangeParams.Scope = DICS_FLAG_GLOBAL;
    PropChangeParams.StateChange = NewStatus; if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
    sizeof(PropChangeParams)))
    {
    FormatMSG(GetLastError(), &lpszMsg);
    throw lpszMsg;
    } // Call the ClassInstaller and perform the change.
    if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))
    {
    FormatMSG(GetLastError(), &lpszMsg);
    throw lpszMsg;
    } SetCursor(hCursor); 
    return TRUE;
    }
    catch (TCHAR * pszError)
    {
    SetCursor(hCursor);
    ::MessageBox(NULL,pszError,_T("提示"),MB_OK);
    if (NULL != lpszMsg)
    {
    LocalFree((HLOCAL)lpszMsg);

    return FALSE;

    }// This Function can stop/start the wireless.
    // Parameters description:The nStatus has three state.-1:do nothing
    // 0 :stop the wireless,1:start the wireless.
    // nIndex is the parameter to said if stop the Wireless.
    // if you want to stop the Wireless,you can call ControlDisk(0, 4).
    BOOL CDriveDemoDlg::ControlDisk(int nStatus, int nIndex)
    {
    if (-1 == nStatus)
    {
    return FALSE;
    }  LPTSTR lpszMsg = NULL;
    try
    {
    TCHAR * GUIDString = NULL;
    GUID guid;
    ZeroMemory(&guid, sizeof(GUID));
    GUIDString = _T("4d36e972-e325-11ce-bfc1-08002be10318");
    UuidFromString((unsigned char *)GUIDString, &guid);
    hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);
    if (INVALID_HANDLE_VALUE == hDevInfo)
    {
    FormatMSG(GetLastError(), &lpszMsg);
    throw lpszMsg;
    } DWORD i;int Icount=0;
    SP_DEVINFO_DATA DeviceInfoData;
    ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
    {
     //Get DeviceInfo            
    DWORD DataT;
    LPTSTR buffer = NULL;
    DWORD buffersize = 0;
    DWORD Status, Problem; 
    BOOL bDisabled = FALSE; 
    BOOL bwireless=FALSE;
                while (!SetupDiGetDeviceRegistryProperty(
                           hDevInfo,
                         &DeviceInfoData,
                            SPDRP_DEVICEDESC, //Read the names of the designated card
                         &DataT,
                         (PBYTE)buffer,
                         buffersize,
                            &buffersize)
    )
    {

    if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
    {                
    if (buffer) LocalFree(buffer);
    buffer=(char*)LocalAlloc(LPTR,buffersize);              
    }
    else
    { // Insert error handling here.
    AfxMessageBox("读取网卡错误");
    }
    }

    CString strEthernet = buffer ;
    char *str=strupr(buffer);
    char *str2="WIRELESS";//wireless sign
    char *p;
                            p=strstr(str,str2);//compare
    if (p!=NULL) bwireless=TRUE;//ok,found.
    if (int i= CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst,0) != CR_SUCCESS) 
    {    FormatMSG(GetLastError(), &lpszMsg);
    throw lpszMsg;
    }
    if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))) 
    {  bDisabled = FALSE;} 
    if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem)) 
    {  bDisabled = TRUE; } 
    if( (bDisabled==FALSE) && (0 == nStatus) && (bwireless) )
    { ChangeStatus(DICS_DISABLE, i, hDevInfo);// 禁用
    bwireless=FALSE;
    }
    if( (bDisabled==TRUE) && (1 == nStatus) && (bwireless) )
    { ChangeStatus(DICS_ENABLE, i, hDevInfo);// 启用
    bwireless=FALSE;
    } }
    return SetupDiDestroyDeviceInfoList(hDevInfo);
    }
    catch (TCHAR * pszError)
    {
    ::MessageBox(NULL,pszError,_T("提示"),MB_OK);
    if (NULL != lpszMsg)
    {
    LocalFree((HLOCAL)lpszMsg);

    return FALSE;
    }
    return FALSE;
    }
    // 禁用
    void CDriveDemoDlg::OnButtonSearialport1()  

    ControlDisk(0,4);
    }
    // 启用
    void CDriveDemoDlg::OnButtonSearialport2() 
    {
    ControlDisk(1,4);
    }
      

  6.   

    你编译的方式是不是Win32的,可以试试x64的编译,两者编译出来的Tool是不一样的。前者是Win32系统运行的Tool,后者是Win64系统运行的Tool