VC Skills 4

来源:互联网 发布:java cs架构 编辑:程序博客网 时间:2024/04/29 09:44

直接读取硬盘的指定扇区
 (1)用汇编;
 (2)直接用CreateFile("//./PHYSICALDRIVE0", ...)打开物理磁盘设备即可(物理磁盘设备都是从0开始排号的,0表示第一块硬盘,1表示第二块硬盘....),这样用SetFilePointer可以随意读取硬盘上任何位置的东西!至于扇区嘛,一般都是512字节为1扇区的,自己换算就是了~          

这里有更多内容:http://www.51cto.com/html/2005/1110/11133.htm


 获得本机并口的起始地址:
可以读取bios数据区域,当然只能在未进入保护模式的操作系统前或dos下读取
段地址:00H

408H 字    计算机上0号并行打印机适配器的基地址,
40AH 字  计算机上1号并行打印机适配器的基地址。
40CH 字  计算机上2号并行打印机适配器的基地址。
40EH 字    计算机上3号并行打印机适配器的基地址。(PS2型此值为扩展BIOS数据区段地址)
SetupAPI 可以得到所有设备的信息包括IO端口,内存资源,中断号码

更换桌面背景:
方法一
看这里:http://www.vckbase.com/vckbase/vckbase10/vc/nonctrls/atlcomocx_02/1002001.htm,用了com中IActiveDesktop,这是个活动桌面的COM接口,还有智能指针,可以顺便学习一下这方面内容;
方法二
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c://aa.bmp", 1); //jpg图片不行,无法显示

请问如何让SDI程序启动时自动隐藏:http://community.csdn.net/Expert/topic/4602/4602225.xml?temp=.1871607
 http://blog.csdn.net/enoloo/archive/2004/06/07/17638.aspx //这个是要最大化的
把pMainFrame->ShowWindow(SW_HIDE);

这句加在ParseCommandLine(cmdInfo);的后面,if (!ProcessShellCommand(cmdInfo))的前面

高效的方法得到一个文本文件有多少行:

  #include   <afx.h>  
  #include   <iostream.h>  
   
  void   main()  
  {  
  CString   str="";  
  CFile   file("f://test.txt",CFile::modeRead);  
  char*   temp=new   char[file.GetLength()+1];  
  memset(temp,0,file.GetLength()+1);  
  file.Read(temp,file.GetLength());  
  str=temp;  
  int   LineNumber=str.Replace("/r/n","");  
  file.Close();  
  delete   temp;  
  temp=NULL;  
  cout<<"文件共有"<<LineNumber+1<<"行"<<endl;       //别忘了要加1  
  }
  

精确的计时

__int64 lfreq;
BOOL bret=QueryPerformanceFrequency((LARGE_INTEGER*)&lfreq);
__int64 lstart;
QueryPerformanceCounter((LARGE_INTEGER*)&lstart);
//... call your function
__int64 lstop;
QueryPerformanceCounter((LARGE_INTEGER*)&lstop);
__int64 lruntime=lstop - lstart;
double dsec= lruntime/lfreq;

弹出USB设备安全删除对话框:WinExec("C://WINDOWS//system32//rundll32.exe shell32.dll,Control_RunDLL hotplug.dll",SW_SHOW);
弹出“数据链接属性”对话框:IDataSourceLocatorPtr::PromptNew();

CBitmap=====>HBITMAP:
-------------------------------------------------------------------------------------
 CBitmap bitmap;
 HBITMAP hbitmap=(HBITMAP)bitmap; //CBitmap中重载了HBITMAP()操作符,可以方便地用它来强制转换

HBITMAP=====>CBitmap:
 ---------------------------------------
 HBITMAP hbitmap;
 CBitmap bitmap;
 bitmap.FromHandle(hbitmap);

从其它.exe文件提取.ico图标作为自己程序的图标:

 HINSTANCE hInst = LoadLibrary("b.exe");
 HRSRC hRc = FindResource(hInst, (LPCSTR)1, (LPCSTR)RT_ICON);
 LPVOID lpResource = LockResource(LoadResource(hInst,hRc));

 HANDLE hUpdate = BeginUpdateResource("a.exe", FALSE);
 UpdateResource(hUpdate, (LPCSTR)RT_ICON, (LPCSTR)1, 0, lpResource, SizeofResource(hInst, hRc));
 EndUpdateResource(hUpdate, FALSE);

 CloseHandle(hRc);
 FreeLibrary(hInst);

得到当前屏幕的参数,最好是用函数EnumDisplaySettings(其它的方法如:GetSystemMetrics(SM_CYFULLSCREEN);会因为任务栏是否隐藏而可能得不到真实高度),这个函数功能强大,可根据指定的设备名(第一个参数)返回它的显示信息:

 CString strCurrentDifferency,strCurrentColorMode; //分别用来存放屏幕当前分辨率、色彩位数的字符串
 LPDEVMODE gpCurrentMode = new DEVMODE; //用来存储屏幕当前设置的结构指针
 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, gpCurrentMode); //获得当前分辨率的大小和其它信息
 strCurrentDifferency.Format("分辨率:%d*%d",gpCurrentMode->dmPelsWidth,gpCurrentMode->dmPelsHeight);
 strCurrentColorMode.Format("当前颜色位数:%d",gpCurrentMode->dmDisplayFrequency);
 AfxMessageBox(strCurrentDifferency);
 AfxMessageBox(strCurrentColorMode);
 delete gpCurrentMode;
 gpCurrentMode=NULL;
 ---------------------------------------------------------------------
 用CDC::GetDeviceCaps函数也可以:
 ---------------------------------------------------------------------
 CString strCurrentDifferency;
 CDC *pDC=CDC::FromHandle(::GetDC(0)); //随便获得一个DC指针就可以了,这里是获得桌面的DC
 strCurrentDifferency.Format("分辨率:%d*%d",pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));
 AfxMessageBox(strCurrentDifferency);
 ---------------------------------------------------------------------

解决这个工程出现重复编译的错误:http://community.csdn.net/Expert/topic/4610/4610652.xml?temp=.9251825

侦测计算机是否连上网络:InternetGetConnectedStateEx


枚举软件或硬件设备:IMDServiceProvider::EnumDevices


对话框中控件内容的打印:http://community.csdn.net/Expert/topic/4609/4609829.xml?temp=.1613275
使你的dialog支持打印预览:http://www.codeproject.com/printing/#Print+Preview
http://www.codeproject.com/listctrl/listprintdemo.asp
现在没有打印机可试,记在这里先,以后有了再测试。

结束其它的进程:GetWindowThreadProcessId和TerminateProcess函数,不过TerminateProcess尽量少用,它可以直接结束目标进程,目标进程死都不知道是自己怎么死的,来不及保存自己的数据结果,也来不及通知自己所调用的.dll文件。
这里还有个贴子:http://community.csdn.net/Expert/topic/4608/4608816.xml?temp=.9869654

用LockFile函数锁定一个打开文件的某一个区域,可以防止其它进程访问该区域。

使CListCtrl控件的Item标签可以修改:ModifyStyle(0,LVS_EDITLABELS);

修改.exe或其它模块的资源,参考下面几个函数

 LoadLibrary
 FindResource
 LoadResource
 LockResource
 BeginUpdateResource
 UpdateResource
 EndUpdateResource
 FreeResource

bool的大小与BOOL的区别:
 bool在C++里是占用1字节,而BOOL是int类型,int类型的大小是视具体环境而定的;所以来说:false/true只占用1个字节,而TRUE/FALSE视具体环境而言


CFile::GetStatus也可以获得文件的属性信息


获取桌面所有顶级窗口:EnumDesktopWindows、EnumWindowsProc


显示用DirectShow捕捉下来的视频
DirectShow的 IVideoWindow可以设置
 ---------------------------------------------------------------------
 IVideoWindow *pVidWin = NULL;
 pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pVidWin);
 pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
 RECT grc;
 GetClientRect(hwnd, &grc);
 pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);

改变编辑框控件中光标的图形:
 ----------------------------------------------------------
 CBitmap* pBitmap = new CBitmap;
 pBitmap->LoadBitmap(IDB_HAPPY_BITMAP); //IDB_HAPPY_BITMAP为工程中.bmp资源,大小任意,但颜色超过16色的话色彩会失真
 m_editCtrl.CreateCaret(pBitmap); //m_editCtrl为编辑框控件变量
 POINT point;
 point.x=0;
 point.y=0;
 m_editCtrl.SetCaretPos(point); //改变光标的位置,以像素为单位
 m_editCtrl.ShowCaret();

用主题函数改变对话框窗口的可视风格(MSDN上可查到更多这方面的函数):
----------------------------------------------------------------
 #include
 #pragma comment(lib,"uxtheme.lib")
 void CMyDlg::OnTest()
 {
 EnableThemeDialogTexture(m_hWnd,ETDT_ENABLE | ETDT_USETABTEXTURE);
 Invalidate();
 }

字符串====>日期时间:
 -------------------------------------------------
 COleDateTime dt;
 dt.ParseDateTime(_T("2006-2-14 8:00:00"));
 SYSTEMTIME st={0};
 dt.GetAsSystemTime(st);
 //SetLocalTime(&st); //设置电脑中时间

 日期时间====>字符串:
 -------------------------------------------------
 SYSTEMTIME st={0};
 st.wYear=2006;
 st.wMonth=3;
 st.wDay=23;
 st.wHour=8;
 st.wMinute=30;
 st.wSecond=59;
 COleDateTime dt(st);
 AfxMessageBox(dt.Format());


typeid函数可以判断一个对象的类型,详见MSDN,上面有示例代码,不过有点小问题:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_typeid_operator.asp

系统休眠摘自:http://community.csdn.net/Expert/topic/4637/4637403.xml?temp=.8914301
 ------------------------------------------------------------------------------------------------
 if(MessageBox("确实要休眠吗?","关机程序",MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION)==IDYES)
 {
 static HANDLE hToken;
 static TOKEN_PRIVILEGES tp;
 static LUID luid;
 if(::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
 {
 ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
 tp.PrivilegeCount=1;
 tp.Privileges[0].Luid =luid;
 tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
 ::AdjustTokenPrivileges(hToken,false,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
 }
 ::SetSystemPowerState(false,true);
 }

在录音时如何控制录音属性中麦克风或者线路输入的音量
 1.mixerGetNumDevs获取混音设备数量
 2.循环获取设备信息mixerOpen/mixerGetLineInfo
 3.根据获得的MIXERLINE中dwComponentType判断类型来确定是线入/麦克风
 MIXERLINE_COMPONENTTYPE_SRC_LINE/MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
 4.mixerSetControlDetails设置音量
用资源管理器打开指定文件夹,并置目标文件夹为选定状态:WinExec("explorer /n,/select,f://win98", SW_SHOWNORMAL );
打开或关闭输入法:IActiveIME::SetActiveContext

提取.exe或.dll文件中的图标:ExtractIcon
捕捉其他程序最大、最小化消息:http://community.csdn.net/Expert/topic/4647/4647630.xml?temp=.8477289

WM_DEVICECHANGLE消息配合DeviceIoControl函数可禁用U盘

判断编辑框控件是否为只读的:

 CEdit *temp=(CEdit *)GetDlgItem(IDC_EDIT1);
 DWORD a=temp->GetStyle();
 if(a & ES_READONLY) //ES_READONLY=0x800
 AfxMessageBox("Read only");
 else
 AfxMessageBox("NOT read only");

sprintf中打印百分号%的方法,摘自:http://blog.vckbase.com/smileonce/archive/2006/03/16/18521.html
 ------------------------------------------------------------
 int percent = 50;
 char buf[100];
 sprintf(buf, "%d%%%% complete/n! ", percent);
 printf(buf); //这样就只打印一个%了
 printf("%s",buf); //改成这样后打印出两个%了,恰如我们期望的

精确延时,KeStallExecutionProcessor函数来帮你,摘自:http://blog.vckbase.com/zaboli/archive/2006/03/24/18705.html
但是问题是KeStallExecutionProcessor的文档说,他的最小周期不能大于 50微秒!不然会造成系统停顿。。
测试得出 KeStallExecutionProcessor(416)在有的机器上会造成鼠标停顿 -_-但是KeDelayExecutionThread(KernelMode, FALSE, &WaitTime); 无论再怎么设置小的超时,结果都如下10毫秒???差太多了吧

获得文件夹大小的方法,摘自:http://community.csdn.net/Expert/topic/4672/4672088.xml?temp=.2216761
 ----------------------------------------------------------------------------------
 #include
 #import "scrrun.dll" raw_interfaces_only
 int main()
 {
 CoInitialize(NULL);
 {
 try
 {
 Scripting::IFileSystem3Ptr fs;
 fs.CreateInstance(__uuidof(Scripting::FileSystemObject));
 Scripting::IFolderPtr folder;
 fs->GetFolder(_bstr_t("f://win98"),&folder);
 _variant_t vsize;folder->get_Size(&vsize);
 cout<<"f://win98 size:"<<(long)vsize<<" bytes"< }
 catch(_com_error &e)
 {
 _bstr_t bstrSource(e.Source());
 _bstr_t bstrDescription(e.Description());
 cout<<"Get directory size via FileSystemObject, by masterz"< cout<<"COM error occurred,source:"<<(LPCTSTR)bstrSource< cout<<"Description:"<<(LPCTSTR)bstrDescription< }
 }
 CoUninitialize();
 return 0;
 }

打开控制台界面,写点文字在上面

 AllocConsole();//打开控制台窗口
 HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//得到控制台句柄
 unsigned long lgsize;
 char *strbuf="显示这行信息。";
 WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);
 FreeConsole();//关闭释放用于输入新信息的控制台窗口

原创粉丝点击