首页 服务器 编程 必备知识 搜索引擎 圩日手册
站内搜索
最近浏览
推荐文章
热文排行

VC++实用小代码(在vs2003调试通过)


1.获取当前的登录用户名:
首先加入下列两个
#include <LM.h>
#pragma comment(lib,"Netapi32.lib")

wchar_t user_name[MAX_PATH];
BOOL bRet=FALSE;
DWORD dwSize=MAX_PATH;
USER_INFO_1 *info;
if(::GetUserNameW(user_name,&dwSize)){
 if(::NetUserGetInfo(NULL,user_name,1, (byte **) &info)==NERR_Success){
  if(info->usri1_priv==USER_PRIV_ADMIN)
   bRet=TRUE;
 }
}
::NetApiBufferFree(info);
CString str(_T(user_name));
AfxMessageBox("当前用户是:"+str);

2.去掉标题栏
ModifyStyle( WS_CAPTION, WS_MINIMIZEBOX, SWP_DRAWFRAME );

3.设置当前窗口名称
SetWindowText(APPTITLE);

4.获得用户区大小
CRect rect;
GetClientRect(&rect);
rect.Width();
rect.Height();

5.位图操作
CClientDC dc(this);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(&dc);
CBitmap *pOldBmp=dcMemory.SelectObject(&bmp);
//头四个参数设置显示大小,但位图按自己的大小显示上
dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
//头四个参数跟上面的一样,但但后面的四个参数截取位图并改变大小嵌入显示的位置
dc.StretchBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBmp);

6.获得文件信息
需要加入#include <shlwapi.h>
TCHAR szPath[MAX_PATH];
//获取当前的执行文件的全局路径,结果存到szPath中
::GetModuleFileName(NULL,szPath,MAX_PATH);
//删除文件信息的全局路径,结果存到szPath中
::PathRemoveFileSpec(szPath);

7.读写数据文件的信息,类似java的Property.load,save
CString path = "E:\\VC++ Projects\\TestVC71\\Debug\\haha.dat";
CString szStatus;
::GetPrivateProfileString("Parameter","xixi","还没有初始化",szStatus.GetBuffer(255),255,path);
szStatus.ReleaseBuffer();
AfxMessageBox(szStatus);
::WritePrivateProfileString("Parameter","hehe","Liebe Sie.",path);
::WritePrivateProfileString("Other","count","10",path);

8.关于托盘
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
//NIF_MESSAGE表示发送控制消息
//NIF_ICON  表示显示控制栏中的托盘图标
//NIF_TIP  表示任务栏中的托盘图标有动态提示
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);

strcpy(nid.szTip,"模拟程序");
nid.uCallbackMessage = WM_USER + 200;
nid.uID = 10;
nid.hWnd = m_hWnd;
Shell_NotifyIcon(NIM_DELETE,&nid);
Shell_NotifyIcon(NIM_ADD,&nid);


9.窗口的显示和隐藏
AfxGetApp()->GetMainWnd()->ShowWindow(SW_HIDE);
AfxGetApp()->GetMainWnd()->UpdateWindow();
::Sleep(2000);
AfxGetApp()->GetMainWnd()->ShowWindow(SW_SHOWNORMAL);
AfxGetApp()->GetMainWnd()->UpdateWindow();


10.获得当前驱动器个数信息
DWORD GetLogicalDrives()
返回的是一个无符号长整型,最低为是否存在驱动器A,若为0,则不存在驱动器A,为1,存在驱动器A,以此类推.


11.获得驱动器类型
UINT WINAPI GetDriveType(__in LPCTSTR lpRootPathName);
lpRootPathName是"A:\\"这样的字符串,可能要大写的,所以之前最好MakeUpper(),
返回值是
DRIVE_UNKNOWN,DRIVE_NO_ROOT_DIR,DRIVE_REMOVABLE,DRIVE_FIXED,DRIVE_REMOTE,DRIVE_CDROM,DRIVE_RAMDISK


12.获得驱动器信息
BOOL WINAPI GetVolumeInformation(
  __in          LPCTSTR lpRootPathName,//"A:\\"
  __out         LPTSTR lpVolumeNameBuffer,
  __in          DWORD nVolumeNameSize,
  __out         LPDWORD lpVolumeSerialNumber,
  __out         LPDWORD lpMaximumComponentLength,//支持的最大文件名长度
  __out         LPDWORD lpFileSystemFlags,
  __out         LPTSTR lpFileSystemNameBuffer,
  __in          DWORD nFileSystemNameSize
);


13.修改对话框的中各控件的属性
CDialog* pDlg = new CMyDlg();
//比如Button控件,使其变灰
(CButton* )pbutton = (CButton* )pDlg->GetDlgItem(ID)
pbutton->EnableWindow(FALSE);
if(pbutton->GetCheck()==BST_UNCHECKED)


14.按住对话框的任何位置都相当于按住了标题栏.这样在隐藏了标题栏的情况下可以拖动对话框
在OnLButtonDown(UINT nFlags, CPoint point)调用
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y));

15.使窗口最小化
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(0, 0));


16.获取鼠标位置
BOOL GetCursorPos(__out LPPOINT lpPoint);


17.关于WM_CONTEXTMENU
The WM_CONTEXTMENU message notifies a window that the user clicked the right mouse button (right-clicked) in the window.
wParam是所在窗口的handle,lParam的低字为鼠标x,高字为鼠标y


18.判断系统为NT内核(NT/2000/XP/Server2003/Vista/Server2008是NT内核)
(95/98/Me是9x内核)
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OSVersionInfo);
if(OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)//==2
 return TRUE;
else if(OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)//==1
 return FALSE


19.若程序已经打开就结束本次打开
插入到程序的InitInstance()函数中
HANDLE m_hMutex=CreateMutex(NULL,TRUE, "ZFCARD");
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
 HWND hWnd = ::FindWindow("#32770",APPTITLE);
 ::ShowWindow(hWnd,SW_NORMAL);
 UpdateWindow(hWnd);

 return FALSE;
}


20.关闭句柄对应的资源(只要有资源的句柄,嘿嘿)
BOOL WINAPI CloseHandle(__in HANDLE hObject)
可以关闭的资源包括:
Access token
Communications device
Console input
Console screen buffer
Event
File
File mapping
Job
Mailslot
Memory resource notification
Mutex
Named pipe
Pipe
Process
Semaphore
Socket
Thread
Transaction
Waitable timer
但有很多限制,暂时不要用.


21.得到错误报告:
DWORD WINAPI GetLastError(void);


22.NT的安全关机和重启
BOOL CMainFrame::ShutDown()
{
 HANDLE hToken;
 TOKEN_PRIVILEGES tkp;

 //Get a token for this process.
 if( !OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
    &hToken) )
  MessageBox("No PROCESS_QUERY_INFORMATION access permission.");
  return FALSE;

 //Get the LUID for the shutdown privilege.
 LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
 tkp.PrivilegeCount = 1; //one privilege to set
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

 //Get the shutdown privilege for this process.
 AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);

 //Cannot test the return value of AdjustTokenPrivileges.
 if(GetLastError() != ERROR_SUCCESS)
  return FALSE;

 //Shut down the system and force all applications to close.
 if( !ExitWindowsEx( EWX_POWEROFF | EWX_FORCE,0) )    
  return FALSE;
 /*若要重启调用下面的代码
 if( !ExitWindowsEx( EWX_FORCE | EWX_REBOOT,0) )
  return FALSE;
 */

 return   TRUE;  
}

23.Win9x的关机和重启
直接调用下面的代码
ExitWindowsEx(EWX_SHUTDOWN, 0);//关机
ExitWindowsEx(EWX_REBOOT, 0);  //重启

24.检测是否是管理员权限
BOOL bRet=FALSE;
wchar_t user_name[MAX_PATH];
DWORD dwSize=MAX_PATH;
USER_INFO_1 *info;
if(::GetUserNameW(user_name,&dwSize)){
 if(::NetUserGetInfo(NULL,user_name,1, (byte **) &info)==NERR_Success){
  if(info->usri1_priv==USER_PRIV_ADMIN)
   bRet=TRUE;
 }
}
::NetApiBufferFree(info);
return bRet;

 

好东东,先留着。

[wangjy17908]
添加时间:2010-07-08
版权所有(C)2005-2015