关闭

工作总结

1058人阅读 评论(0) 收藏 举报

一隐藏任务条上的图标
第一、创建对话框时必须将它作为某个不可见框架窗口的子窗口;
第二、这个不可见框架窗口的扩展式样必须设置 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;
}
 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34285次
    • 积分:566
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:3篇
    • 译文:0篇
    • 评论:7条
    最新评论