直接读取硬盘的指定扇区:
(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();//关闭释放用于输入新信息的控制台窗口