winxp+sdk+vc6
这个函数调用了"连接"的属性对话框,用的上下文菜单那条路.
试试替换一下这句:cmi.lpVerb =MAKEINTRESOURCE(8) ;//"Properties";
8是模拟点击"属性(R)",不知道"禁止(B)"是多少.
hwnd传this就成.在2000下使用需要做点修改,而且我本来是用的无线网卡.
方法不好,投机取巧,不过能用.int ShowConfigDlg(HWND hwnd)
{
LPITEMIDLIST pidlControlPanel;
IShellFolder2 *psfCtrlPanel;
IShellFolder *psfDesktop; HRESULT hr=S_OK;
BOOL bRet=false;
DWORD dwErr=0;
LPMALLOC pMalloc; // Intialize the COM library
hr=CoInitialize(NULL);
// Get the memory management allocator
hr=SHGetMalloc(&pMalloc); // Get the desktop folder
SHGetDesktopFolder(&psfDesktop);
// Retrieve the Control Panel folder
hr=SHGetSpecialFolderLocation(NULL, CSIDL_CONTROLS, &pidlControlPanel);
if (FAILED(hr))
return false; // Get the IShellFolder interface
hr=psfDesktop->BindToObject(pidlControlPanel, NULL, IID_IShellFolder, (LPVOID*)&psfCtrlPanel);
psfDesktop->Release(); // Enum the "Control Panel" folder to get the "Network Connections" folder
LPENUMIDLIST ppenum=NULL;
hr=psfCtrlPanel->EnumObjects(NULL,SHCONTF_FOLDERS,&ppenum); IShellFolder2 *psfFirstFolder = NULL;
ULONG celtFetched;
LPITEMIDLIST pidlItems = NULL; STRRET strDispName;
ULONG uAttr;
//
// first search the "Network Connections" folder
//
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfCtrlPanel->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
CString str = strDispName.pOleStr; if(wcscmp(strDispName.pOleStr,L"网络连接"))
{
continue;
}
if(!psfFirstFolder)
{
uAttr = SFGAO_FOLDER;
psfCtrlPanel->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
if(uAttr & SFGAO_FOLDER)
{
hr = psfCtrlPanel->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
}
}
pMalloc->Free(pidlItems);
break;
}// if(ppenum)
// ppenum->Release(); //
// Search the connection you wanna configue, for example, "Local Area Connection"
//
IContextMenu *pcm = NULL;
BOOL bFind;
BOOL bJoynet; if(psfFirstFolder)
{
hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
bFind = FALSE;
bJoynet = FALSE;
//hr = psfFirstFolder->GetDefaultSearchGUID(&guidTemp);
SHELLDETAILS shellDeatails;
//there are 5 state items
for(int i=1;i<6;i++)
{
psfFirstFolder->GetDetailsOf(pidlItems,i,&shellDeatails);
char state[50];
//char *cout = (char*)malloc(sizeof(char)*50);
char *cout = state;
hr = StrRetToStr(&(shellDeatails.str),pidlItems,&cout);
CString csState = cout;
if(csState.Compare(_T("已启用"))==0)
bFind = TRUE;
else
if(csState.Left(6).Compare(_T("Joynet"))==0)
bJoynet = TRUE;
}
//if is in use and is Joynet WLAN in use,than I get it.
if(bFind&&bJoynet)
{
hr=psfFirstFolder->GetUIObjectOf(NULL,1,(LPCITEMIDLIST*)&pidlItems,IID_IContextMenu,NULL,(void**)&pcm);
pMalloc->Free(pidlItems);
break;
}
}
}
//
// Invoke the Properites menu, whose index is 8 on the Windows XP professional (English)
// NOTE: on other platforms, the index of the Properties menu might not be 8
CMINVOKECOMMANDINFO cmi;
ZeroMemory(&cmi,sizeof(CMINVOKECOMMANDINFO));
cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
cmi.fMask = 0;
cmi.hwnd = hwnd;
cmi.lpVerb =MAKEINTRESOURCE(8) ;//"Properties";
cmi.lpParameters = NULL;
cmi.lpDirectory = NULL;
cmi.nShow = SW_SHOWNORMAL;
cmi.dwHotKey = 0;
cmi.hIcon = NULL;
if(pcm&&bFind&&bJoynet)
hr = pcm->InvokeCommand(&cmi); //
// Cleanup
//
if(pMalloc)
pMalloc->Free(pidlControlPanel);
if(psfCtrlPanel)
psfCtrlPanel->Release();
if(psfFirstFolder)
psfFirstFolder->Release();
if(pcm)
pcm->Release(); CoUninitialize(); if(bFind == FALSE||bJoynet == FALSE)
{
MessageBox(NULL,_T("无线网卡没有正确安装或者被禁用!"),_T("错误"),MB_ICONSTOP);
return -1;
} return 0;
}
这个函数调用了"连接"的属性对话框,用的上下文菜单那条路.
试试替换一下这句:cmi.lpVerb =MAKEINTRESOURCE(8) ;//"Properties";
8是模拟点击"属性(R)",不知道"禁止(B)"是多少.
hwnd传this就成.在2000下使用需要做点修改,而且我本来是用的无线网卡.
方法不好,投机取巧,不过能用.int ShowConfigDlg(HWND hwnd)
{
LPITEMIDLIST pidlControlPanel;
IShellFolder2 *psfCtrlPanel;
IShellFolder *psfDesktop; HRESULT hr=S_OK;
BOOL bRet=false;
DWORD dwErr=0;
LPMALLOC pMalloc; // Intialize the COM library
hr=CoInitialize(NULL);
// Get the memory management allocator
hr=SHGetMalloc(&pMalloc); // Get the desktop folder
SHGetDesktopFolder(&psfDesktop);
// Retrieve the Control Panel folder
hr=SHGetSpecialFolderLocation(NULL, CSIDL_CONTROLS, &pidlControlPanel);
if (FAILED(hr))
return false; // Get the IShellFolder interface
hr=psfDesktop->BindToObject(pidlControlPanel, NULL, IID_IShellFolder, (LPVOID*)&psfCtrlPanel);
psfDesktop->Release(); // Enum the "Control Panel" folder to get the "Network Connections" folder
LPENUMIDLIST ppenum=NULL;
hr=psfCtrlPanel->EnumObjects(NULL,SHCONTF_FOLDERS,&ppenum); IShellFolder2 *psfFirstFolder = NULL;
ULONG celtFetched;
LPITEMIDLIST pidlItems = NULL; STRRET strDispName;
ULONG uAttr;
//
// first search the "Network Connections" folder
//
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfCtrlPanel->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
CString str = strDispName.pOleStr; if(wcscmp(strDispName.pOleStr,L"网络连接"))
{
continue;
}
if(!psfFirstFolder)
{
uAttr = SFGAO_FOLDER;
psfCtrlPanel->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
if(uAttr & SFGAO_FOLDER)
{
hr = psfCtrlPanel->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
}
}
pMalloc->Free(pidlItems);
break;
}// if(ppenum)
// ppenum->Release(); //
// Search the connection you wanna configue, for example, "Local Area Connection"
//
IContextMenu *pcm = NULL;
BOOL bFind;
BOOL bJoynet; if(psfFirstFolder)
{
hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
bFind = FALSE;
bJoynet = FALSE;
//hr = psfFirstFolder->GetDefaultSearchGUID(&guidTemp);
SHELLDETAILS shellDeatails;
//there are 5 state items
for(int i=1;i<6;i++)
{
psfFirstFolder->GetDetailsOf(pidlItems,i,&shellDeatails);
char state[50];
//char *cout = (char*)malloc(sizeof(char)*50);
char *cout = state;
hr = StrRetToStr(&(shellDeatails.str),pidlItems,&cout);
CString csState = cout;
if(csState.Compare(_T("已启用"))==0)
bFind = TRUE;
else
if(csState.Left(6).Compare(_T("Joynet"))==0)
bJoynet = TRUE;
}
//if is in use and is Joynet WLAN in use,than I get it.
if(bFind&&bJoynet)
{
hr=psfFirstFolder->GetUIObjectOf(NULL,1,(LPCITEMIDLIST*)&pidlItems,IID_IContextMenu,NULL,(void**)&pcm);
pMalloc->Free(pidlItems);
break;
}
}
}
//
// Invoke the Properites menu, whose index is 8 on the Windows XP professional (English)
// NOTE: on other platforms, the index of the Properties menu might not be 8
CMINVOKECOMMANDINFO cmi;
ZeroMemory(&cmi,sizeof(CMINVOKECOMMANDINFO));
cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
cmi.fMask = 0;
cmi.hwnd = hwnd;
cmi.lpVerb =MAKEINTRESOURCE(8) ;//"Properties";
cmi.lpParameters = NULL;
cmi.lpDirectory = NULL;
cmi.nShow = SW_SHOWNORMAL;
cmi.dwHotKey = 0;
cmi.hIcon = NULL;
if(pcm&&bFind&&bJoynet)
hr = pcm->InvokeCommand(&cmi); //
// Cleanup
//
if(pMalloc)
pMalloc->Free(pidlControlPanel);
if(psfCtrlPanel)
psfCtrlPanel->Release();
if(psfFirstFolder)
psfFirstFolder->Release();
if(pcm)
pcm->Release(); CoUninitialize(); if(bFind == FALSE||bJoynet == FALSE)
{
MessageBox(NULL,_T("无线网卡没有正确安装或者被禁用!"),_T("错误"),MB_ICONSTOP);
return -1;
} return 0;
}
具体请查阅MSDN
{
INTERNET_CONNECTED_INFO ci; memset(&ci, 0, sizeof(ci));
if(fGoOffline)
{
ci.dwConnectedState = INTERNET_STATE_DISCONNECTED_BY_USER;
ci.dwFlags = ISO_FORCE_DISCONNECTED;
}
else
{
ci.dwConnectedState = INTERNET_STATE_CONNECTED;
} InternetSetOption(NULL,
INTERNET_OPTION_CONNECTED_STATE, &ci, sizeof(ci));
}