如何使用api隐藏任务栏“网络连接”图标

nbeleven 2009-07-19 03:05:58
不连网络的时候,那个网络图标是“X”的,所以偶尔会弹出“网络无连接”的提示,影响我的程序自动截图。所以我想把那个图标隐藏起来,用禁用网络可以实现吧。我在版上找了找要不就是vb的,要不就是vbs脚本。
有没有Vc版本的啊?
除了禁用网络来实现隐藏,其他方法隐藏也可。
...全文
369 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nbeleven 2009-07-21
  • 打赏
  • 举报
回复
程序前加了如下代码
#include "stdafx.h"
#include "afxwin.h"
#include "setupapi.h"
#include "shlwapi.h"
#include <iostream>
using namespace std ;
#pragma comment(lib,"setupapi.lib")
#pragma comment(lib,"shlwapi.lib")
编译通过了。
但是我不知道怎么把网卡描述符怎么传进去了。
按你的网卡描述,这么写?编译不过啊。
CtrlNetcard(Atheros L2 Fast Ethernet 10/100 Base-T Controller,TRUE)
danxuezx 2009-07-21
  • 打赏
  • 举报
回复

#include <iphlpapi.h>

#include <SetupAPI.h>
#pragma comment(lib,"setupapi.lib")


#include<wininet.h>
#pragma comment(lib,"wininet.lib")


#include <wlanapi.h>
#include <ntddndis.h>
#include <atlbase.h>

上面应该是要包颜色字体的头文件和lib文件。
danxuezx 2009-07-21
  • 打赏
  • 举报
回复
另外我贴的代码在xp下可以正常工作,但在vista下不能正常工作,vista下应采用5楼朋友说的命令。但这个命令在XP下好像不能正常工作。
danxuezx 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nbeleven 的回复:]
danxuezx:谢谢你给我贴的代码,需要包含哪个头文件呢?
传入网卡描述信息应该怎么传入?

[/Quote]
您查里面用到的API就知道包哪些头文件了,都是SetUP之类的函数。网卡描述符就是:
Atheros L2 Fast Ethernet 10/100 Base-T Controller(这是我机子上网卡的描述符,在右击电脑-属性-硬件-装置管理员-选择网卡就可以看到。)
beautyloveme 2009-07-21
  • 打赏
  • 举报
回复
有另外一种思路,就是把托盘区的那个图标给隐藏了,不知道行不行
nbeleven 2009-07-21
  • 打赏
  • 举报
回复
555,我运行了报一堆错,应该是没有包含头文件吧,谁来告诉我要包含哪个头文件啊!
nbeleven 2009-07-20
  • 打赏
  • 举报
回复
danxuezx:谢谢你给我贴的代码,需要包含哪个头文件呢?
传入网卡描述信息应该怎么传入?
cutestar 2009-07-20
  • 打赏
  • 举报
回复
VB也是用了API来处理的,或是用的CMD,如:
禁用网卡:netsh interface set interface "本地连接" disabled
启用网卡:netsh interface set interface "本地连接" enabled
C也可以类似处理.如果用API来处理,参考下:
http://www.hackbase.com/tech/2009-04-28/52476.html
danxuezx 2009-07-20
  • 打赏
  • 举报
回复
上面的代码比较乱,另外如果您想直接disable所有网卡,应该把代码中的
if(!_tcsicmp(/*_T("PCI")*/NetCardDescription, (LPTSTR)PropertyBuffer))
做一下修改。
danxuezx 2009-07-20
  • 打赏
  • 举报
回复
DWORD   CtrlNetcard(TCHAR* NetCardDescription,BOOL   bStatus)   
{
/*cout<<"1"<<endl;
wprintf(_T("1 %s\n"),NetCardDescription);*/

LPCTSTR HardwareId = _T("{4D36E972-E325-11CE-BFC1-08002BE10318}"); //网卡类
GUID g = {0X4D36E972, 0XE325, 0X11CE, {0XBF, 0XC1, 0X08, 0X00, 0X2B, 0XE1, 0X03, 0X18}};//网卡的GUID
DWORD NewState = 0;

//调用ddk函数,来禁用网卡
DWORD i = 0, err = 0;
HDEVINFO hDevInfo = NULL;
SP_DEVINFO_DATA spDevInfoData = {0};

//如果bStatus 为TRUE,则NewState为1-enable,否则为2-disable
NewState = bStatus ? DICS_ENABLE : DICS_DISABLE;

//访问系统的硬件库,过滤出PCI设备,得到PCI设备集合
//hDevInfo = SetupDiGetClassDevs(NULL, _T("PCI"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
hDevInfo = SetupDiGetClassDevs(&g, NULL, NULL, DIGCF_PRESENT);
if(INVALID_HANDLE_VALUE == hDevInfo)
{
_tprintf(_T("访问系统硬件出错!"));
return GetLastError();
}

//枚举硬件,获得需要的接口
spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
memcmp(&(spDevInfoData.ClassGuid), &g, sizeof(GUID));

for(i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
{

PBYTE PropertyBuffer = NULL;
DWORD PropertyBufferSize = 0;

//获得硬件的属性值,找GUID
while(!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&spDevInfoData,
/*SPDRP_ENUMERATOR_NAME*/
SPDRP_DEVICEDESC,
NULL,
PropertyBuffer,
PropertyBufferSize,
&PropertyBufferSize))
{ //如果返回FAILE,判断是不是buffer不合适,如果是则重新分配buffer再次调用,
//否则退出此循环
if(ERROR_INSUFFICIENT_BUFFER == GetLastError())
{
if(PropertyBuffer)
{
free(PropertyBuffer);
}
PropertyBuffer = (PBYTE)malloc(PropertyBufferSize);
}
else
{
break;
}
}

//如果调用成功,判断buffer是否有值,没有则枚举下一设备
if(!PropertyBuffer)
{
continue;
}
//wprintf(_T("2 %s\n"),(LPTSTR)PropertyBuffer);
//buffer有值,判断buffer里的GUID是不是网卡GUID
if(!_tcsicmp(/*_T("PCI")*/NetCardDescription, (LPTSTR)PropertyBuffer)) //如果GUID是网卡GUID则进行相关处理
{
//cout<<"2"<<endl;
SP_PROPCHANGE_PARAMS spPropChangeParams ;
free(PropertyBuffer);
spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
spPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; //表示设备安装信息将要改变,通知系统重新安装
spPropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC /*DICS_FLAG_GLOBAL*/; //Make the change in all hardware profiles
spPropChangeParams.StateChange = DICS_DISABLE /*NewState*/; //disable or enable

printf("disable");
if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,
(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))
{ //修改,若成功则返回TRUE,否则返回FALSE
err = GetLastError();
//cout<<"err1 : "<<err<<endl;
goto cleanup_DeviceInfo;
}

if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))
{ //重新安装,若成功则返回TRUE,否则返回FALSE
err = GetLastError();
//cout<<"err2 : "<<err<<endl;
goto cleanup_DeviceInfo;
}

SP_DEVINSTALL_PARAMS DeviceInstallParams;
//printf("hello");
if(SetupDiGetDeviceInstallParams(hDevInfo,&spDevInfoData,&DeviceInstallParams))
{
if((DeviceInstallParams.Flags == DI_NEEDREBOOT) ||
(DeviceInstallParams.Flags == DI_NEEDRESTART ))
{
cout<<"Need Reboot!"<<endl;
}
}
else
goto cleanup_DeviceInfo;
}
else //若没有值则枚举下一个设备信息
{
free(PropertyBuffer);
}
}
cleanup_DeviceInfo :
SetupDiDestroyDeviceInfoList(hDevInfo);
return err;
}

传入网卡描述信息和是禁用还是启用标志就好了。TRUE为Enable,FALSE为disable
danxuezx 2009-07-20
  • 打赏
  • 举报
回复
等我给你一个禁用网络的代码。
jyh_baoding 2009-07-20
  • 打赏
  • 举报
回复
应该有实现方法,帮顶

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧