一隐藏任务条上的图标
第一、创建对话框时必须将它作为某个不可见框架窗口的子窗口;
第二、这个不可见框架窗口的扩展式样必须设置 WS_EX_TOOLWINDOW;
第三、保证对话框的扩展式样没有设置 WS_EX_APPWINDOW;
先在CWinApp继承类中建立一个不显示的顶级窗口.
CFrameWnd *pFrame=new CFrameWnd();
pFrame->Create(0,0,WS_OVERLAPPEDWINDOW);
CNoTaskBarIconDlg dlg(abc);
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{}
else if (nResponse == IDCANCEL)
{}
delete pFrame;
在 OnInitDialog中修改显示风格 WS_EX_APPWINDOW
BOOL CNoTaskBarIconDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ModifyStyleEx(WS_EX_APPWINDOW,0);
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE;
}
或用下面代码
long lExStyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);
lExStyle &= ~WS_EX_APPWINDOW; // 去除AppWindow扩展风格
lExStyle |= WS_EX_TOOLWINDOW; // 增加ToolWindow扩展风格
::SetWindowLong(m_hWnd, GWL_EXSTYLE, lExStyle);
二 建立一个无界面的应用程序隐藏对话框窗口
1,改变对话框显示状况
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, WS_EX_TOOLWINDOW);
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_SETMINPOSITION;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
在需要显示时
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_SHOW;
SetWindowPlacement(&wp);
这样的效果很不理想:窗口显示在屏幕的左上角,并且是只有标题栏,要正常显示,还需加上如下代
码:
定义一个成员变量CRect rect;
在OnInitDialog()里面:
GetWindowRect(&rect);
在需要显示的地方:
SetWindowPos(&wndNoTopMost, wndRc.left, wndRc.top, wndRc.right, wndRc.bottom,
SWP_SHOWWINDOW);
CenterWindow();
即使这样,效果还是很差。
这种方法还有一个弊端是当程序开始运行并且隐藏起来后,原来激活的窗口变成了非激活状态了,而
当对话框显示出来后,对话框自身也是非激活状态的。
总结一下:
在OnInitDialog()中加入
CenterWindow();//让窗口在正中显示
GetWindowPlacement(&hwp);//得到当前的窗口信息
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
窗口显示:ModifyStyleEx(WS_EX_TOOLWINDOW,WS_EX_APPWINDOW);
SetWindowPlacement(&hwp);//记得要申明一个全局变量
窗口隐藏:ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
2将对话框作为子窗口
这种方法是采用SDI框架,主窗口始终隐藏,对话框作为主窗口的成员变量,在CMainFrame::OnCreate()
里面加入下代码:
if(!dlg.Create(IDD_MYDIALOG, this))
{
return –1;
}
dlg.ShowWindow(SW_HIDE);
在要显示对话框的地方用dlg.ShowWindow(SW_SHOW);
即可。注意,主窗口一定要隐藏,否则对话框可能会闪现一下。
3不绘制窗口
当对话框显示时将要响应消息WM_PAINT绘制客户区,相应消息WM_NCPAINT绘制窗口边框。我们在窗口
第一次自绘自身时隐藏窗口,可以收到比较良好的效果。由于窗口是先画窗口边框,所以我们仅需处理
WM_NCPAINT即可。代码如下:
添加WM_NCPAINT处理函数。
void CMyDialog::OnNcPaint()
{
static int i = 2;
if(i > 0)
{
i --;
ShowWindow(SW_HIDE);
}
else
CDialog::OnNcPaint();
}
我们只要窗口隐藏第一次,所以定义这个变量可以判断是否时首次显示窗口。当程序开始运行时,
系统发送(SendMessage)WM_NCPAINT消息,此时程序的窗口边框应该被显示,但是此时我们没有作任何
显示的操作,而是将窗口隐藏,ShowWindow(SW_HIDE)将把窗口的 WS_VISIBLE属性去掉,继续执行,
程序将检查WS_VISIBLE属性,如果没有则显示窗口,所以又发送了一个WM_NCPAINT消息。所以我们要处
理两次WM_NCPAINT消息。
在需要窗口显示时,调用ShowWindow(SW_SHOW)即可。
程序执行的结果是,原来处于激活状态的窗口可能会闪动两下,然后仍然处于激活状态。这种处理方
式比上面的方式要优越得多。
三 使你的对话框位于最顶端
在 OnInitDialog()中用SetWindowPos来实现。
SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
四,半透明绘制
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldBit = (CBitmap*)MemDC.SelectObject(pBitmap);
BITMAP bm;
pBitmap->GetBitmap(&bm);
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 50;
bf.AlphaFormat = 0;
::AlphaBlend(pDC->GetSafeHdc(), pt.x, pt.y, bm.bmWidth, bm.bmHeight,
MemDC.GetSafeHdc(),0, 0, bm.bmWidth, bm.bmHeight, bf);
MemDC.SelectObject(pOldBit);
MemDC.DeleteDC();
五,只运行一个实例
handle=::CreateMutex(NULL,FALSE,one);//handle为声明的HANDLE类型的全局变量
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox("应用程序已经在运行");
return FALSE;
}
六半透明窗体设置
HWND hWnd = GetSafeHwnd();
LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);
g_pSetLayeredWindowAttributes(hWnd, 0, (BYTE)m_sldAlpha.GetPos(), 2);
::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
七 关于获取本地磁盘盘符
有四个基本的函数:GetLogicalDrives, GetLogicalDriveStrings, GetDriveType 和
GetVolumeInformation。第五个是 SetVolumeLabel,如果你愿意,可以用它设置卷标。
第一个函数,GetLogicalDrives,返回一个DWORD的位掩码(bitmask)值,以告知驱动盘符。“0”表示
是驱动器A,“1”表示驱动器B,依次类推。
10110 10001 11000 00000 00000 00000 00
这条信息表示在我的电脑里有驱动器:A、C、D、F、J、K、和L。
第二个函数GetLogicalDriveStrings,它返回一个代表所有驱动器字母的重要字符串。每一个驱动器字
母拥有D:/(尾随一个‘/’)的形式,这里 D 表示驱动器盘符,每个字符串有一空(null)终结符,结
尾处有两个null。
GetDriveType返回一个代码,如2代表软驱, 3代表硬盘,5代表CD-ROM驱动器。
1. GetLogicalDriveStrings方法
TCHAR buf[100];
DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);
从名字上就知道GetLogicalDriveStrings是获得盘符的字符形式
这个函数将所有盘符都存在buf中,形式是这样:
"C:/<NULL>D:/<NULL>E:/<NULL><NULL>"
即盘符之间用NULL隔开,最后一个盘符后面跟两个NULL
所以可以这样从buf中提取单个盘符:
for (CString strDisks,TCHAR* s=buf; *s; s+=_tcslen(s)+1)
{
LPCTSTR sDrivePath = s; //单个盘符
strDisks += sDrivePath;
strDisks += " ";
}
2. GetLogicalDrives方法
DWORD dwDrives;
char a;
CString DriveName;
dwDrives = GetLogicalDrives();
a = 'A';
while (dwDrives > 0)
{
if (dwDrives % 2 == 1)
{
DriveName.Format("%c", a);
GetTreeCtrl().InsertItem(DriveName, m_nImageClose,
m_nImageOpen, TVI_ROOT, TVI_LAST);
}
a++;
dwDrives /= 2;
}
GetLogicalDrives函数返回一个DWORD值,4个字节32bit,每个bit代表一个盘符,比如bit0代表A盘,但是因
为英文字母只有26个,所以最多可以表示26个盘符,不过,一般来说是够用了
八 禁止上网
void CNetHelp::StartForbidNet()
{
if (m_bIsStartForbid)
return;
PfCreateInterface(0,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
FALSE,
TRUE,
&m_hInterface);
// 绑定需要网络包过滤的IP地址
BYTE localIp[] = {192,168,3,2};
BYTE MaskIP[] = {255, 255, 255, 0};
PfBindInterfaceToIPAddress(m_hInterface, PF_IPV4, localIp);
// 填充过滤包的规则结构
PF_FILTER_DESCRIPTOR inFilter;
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
inFilter.dwRule = 0; //一直添这个值
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
inFilter.SrcAddr = m_localIp; //设置本地IP地址
inFilter.SrcMask = m_MaskIP; //设置本地子网掩码
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
inFilter.DstAddr = 0; //任意目标地址
inFilter.DstMask = 0;
inFilter.wDstPort = 80; //目标端口 80(http 服务)
inFilter.wDstPortHighRange = 80;
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
// 加入一个过滤接口
PfAddFiltersToInterface(m_hInterface, 1, &inFilter, 0, NULL, &m_fHandle);
m_bIsStartForbid = TRUE;
}
void CNetHelp::StopForbidNet()
{
if (m_bIsStartForbid)
{
PfRemoveFilterHandles(m_hInterface, 1, &m_fHandle);
PfUnBindInterface(m_hInterface);
PfDeleteInterface(m_hInterface);
}
}
九 文件夹监视
DWORD WINAPI CNetHelp::ThreadProc(LPVOID lParam)
{
PARAM* pParam = (PARAM*)lParam;
CNetHelp* pNetHelp = (CNetHelp*)pParam->pNetHelp;
HANDLE hFile = CreateFile(pNetHelp->m_strDriver[pParam->nID],
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
if (INVALID_HANDLE_VALUE == hFile)
return 0;
char buf[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION*)buf;
DWORD dwBytesReturned = 0;
while(true)
{
if(ReadDirectoryChangesW(hFile,
pNotify,
sizeof(buf),
true,
FILE_NOTIFY_CHANGE_FILE_NAME|
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_CREATION|
FILE_NOTIFY_CHANGE_SECURITY,
&dwBytesReturned,
NULL,
NULL ) )
{
char tmp[MAX_PATH] = {0};
char str1[MAX_PATH] = {0};
strcpy(str1, pNetHelp->m_strDriver[pParam->nID].GetBuffer(0));
char str2[MAX_PATH] = {0};
strcpy(str2, pNetHelp->m_strDriver[pParam->nID].GetBuffer(0));
WideCharToMultiByte(CP_ACP,0,pNotify->FileName,pNotify-
>FileNameLength/2,tmp,99,NULL,NULL );
strcat(str1, tmp);
if(pNotify->NextEntryOffset !=0 )
{
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)
((char*)pNotify+pNotify->NextEntryOffset);
memset(tmp, 0, sizeof(tmp));
WideCharToMultiByte( CP_ACP,0,p->FileName,p-
>FileNameLength/2,tmp,99,NULL,NULL );
strcat(str2, tmp );
}
switch(pNotify->Action)
{
case FILE_ACTION_ADDED:
break;
case FILE_ACTION_REMOVED:
break;
case FILE_ACTION_MODIFIED:
break;
case FILE_ACTION_RENAMED_OLD_NAME:
{
if (pNetHelp->m_pCallBack)
pNetHelp->m_pCallBack
(TYPE_REFILENAME, (int)str1, (int)str2);
}
break;
case FILE_ACTION_RENAMED_NEW_NAME:
{
if (pNetHelp->m_pCallBack)
pNetHelp->m_pCallBack
(TYPE_REFILENAME, (int)str1, (int)str2);
}
break;
default:
break;
}
}
else
break;
}
return 0;
}
十 取网络时间
unsigned int CNetHelp::GetNetTime()
{
if (m_Socket != INVALID_SOCKET)
{
closesocket(m_Socket);
m_Socket = INVALID_SOCKET;
}
m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_Socket == INVALID_SOCKET)
{
return 0;
}
// static char szIPAddr[] = {"129.6.15.29"};
// static char szIPAddr[] = {"192.43.244.18"}; //13
static char szIPAddr[] = {"193.204.114.105"};
unsigned int nTime = 0;
char szBuf[128] = {0};
sockaddr_in SerAdr;
SerAdr.sin_family = AF_INET ;
SerAdr.sin_port = htons (IPPORT_TIMESERVER) ;
SerAdr.sin_addr.S_un.S_addr = inet_addr (szIPAddr) ;
int nRet = connect(m_Socket, (SOCKADDR *)&SerAdr, sizeof (SerAdr));
if (SOCKET_ERROR == nRet)
{
closesocket(m_Socket);
return 0;
}
Sleep(200);
nRet = recv(m_Socket, (char*)&nTime, 4, 0);
if (nRet == 4)
{
closesocket(m_Socket);
m_Socket = 0;
nTime = ntohl(nTime);
COleDateTime t00( 1900, 1, 1, 0, 0, 0 ); // 1900.1.1 00:00:00
COleDateTime t70( 1970, 1, 1, 0, 0, 0 ); // 1970.1.1 00:00:00
COleDateTimeSpan ts70to00 = t70 - t00;
DWORD dwSpan = (DWORD)ts70to00.GetTotalSeconds();
nTime = nTime - dwSpan;
return nTime;
}
closesocket(m_Socket);
m_Socket = 0;
return 0;
}