由于自己不是专业的程序员,对C、C++、VC等也还基本属于门外汉的水平,更主要的是,自己仅仅是在心血来潮的时候才编写、阅读一些程序,很多时候以前学会的东西,过一段时间后又忘得一干二净了,以前用过的一些现成的代码又不知哪里找了。因此,在这里将这些自己在各个时候用到的一些能简单直接拿来使用的代码做一下记录,方便自己查找。【不定期更新】
【备注】:下面的代码都没有注明需要包含哪些头文件,可能某些代码需要额外包含某些头文件,自己试试看了。
目录:
1、通过PC喇叭演奏音乐 2、向指定窗口发送文本内容 3、锁闭、解锁光驱面板上的按钮
4、设置窗口透明度 5、设置窗口置顶 6、设置鼠标穿透
7、VC用字符串截取字符串的函数(比AfxExtractSubString更好) 8、读取整型内存数据
9、关机函数, 适用9X和NT 10、将16进制字符串转换为10进制数值 11、在CTreeCtrl中使用32位色的图标
=========================================================================
=========================================================================
1、通过PC喇叭演奏音乐 (返回顶部)
void beep_music(DWORD frequency[], DWORD delay[], int n)
// DWORD frequency[]:所演奏音乐的频率表
// DWORD delay[]:所演奏音乐的延时表
// int n:频率表和延时表数组的长度,两表长度应该一致
... {
int circle;
for(circle=0;circle<n;circle++)
...{
Beep(frequency[circle],delay[circle]);
}
}
C/C++中的音乐频率对应列表 | |||||||
音频/音亮 | C(1) | D(2) | E(3) | F(4) | G(5) | A(6) | B(7) |
低音 | 131 | 147 | 165 | 175 | 196 | 220 | 247 |
中音 | 262 | 296 | 330 | 349 | 392 | 440 | 494 |
高音 | 523 | 587 | 659 | 698 | 784 | 880 | 988 |
高二度 | 1047 | 1175 | 1319 | 1397 | 1568 | 1760 | 1976 |
音乐节拍 | |||||||
一个节拍延时:2400 分为 1/2节拍…………1/8节拍 依次除以2即可 |
... {
unsigned frequency[]=...{392,392,440,392,523,494,
392,392,440,392,587,523,
392,392,784,659,523,494,440,
698,698,659,523,587,523};/**//*这个是频率表*/
unsigned delay[]=...{375,125,500,500,500,1000,
375,125,500,500,500,1000,
375,125,500,500,500,500,1000,
375,125,500,500,500,1000,};/**//*这个是节拍表*/
beep_music(frequency, delay,25);
}
2、向指定窗口发送文本内容 (返回顶部)
【我将其用于网游的自动喊话中】
void SendStringA(HWND hWnd, char * str, int len)
... {
int i;
BYTE ch;
if(hWnd)
...{
for(i=0;i<len;)
...{
ch=(BYTE)str[i];
if(IsDBCSLeadByte(ch))
...{
i++;
SendMessageA(hWnd,WM_IME_CHAR,MAKEWORD((BYTE)str[i],ch),0);
i++;
}
else
...{
SendMessageA(hWnd, WM_IME_CHAR, (WORD)ch, 0);
i++;
}
}
PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0); //发送回车键
}
}
// 向指定窗口发送文本内容,Unicode版本
void SendStringW(HWND hWnd,WCHAR * str, int len)
... {
int i;
if(hWnd)
...{
for(i=0;i<len;i++)
...{
SendMessageW(hWnd, WM_IME_CHAR, str[i], 0);
}
PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0); //发送回车键
}
}
3、锁闭、解锁光驱面板上的按钮 (返回顶部)
BOOL LockCD( char * DriveLetter,BOOL Lock)
// char *DriveLetter:待锁闭、解锁的光驱盘符
// BOOL Lock:TURE表示锁闭,FALSE表示解锁
... {
char szDevice[10];
::sprintf_s( szDevice,"//./%c:", DriveLetter[0] );
HANDLE m_handle;
m_handle=CreateFileA(szDevice,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);
DWORD dw;
PREVENT_MEDIA_REMOVAL rPMR;
rPMR.PreventMediaRemoval=Lock;
if(m_handle==NULL)
return FALSE;
BOOL fResult=DeviceIoControl(m_handle,IOCTL_STORAGE_MEDIA_REMOVAL,&rPMR,sizeof(rPMR),NULL,0,&dw,NULL);
//IOCTL_STORAGE_MEDIA_REMOVAL:Enables or disables the media eject mechanism.
CloseHandle(m_handle);
return fResult;
}
4、设置窗口透明度 (返回顶部)
void SetTransparence(HWND hWnd,BYTE Pos)
... {
SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd,0,Pos,LWA_ALPHA);
}
5、设置窗口置顶 (返回顶部)
BOOL SetWindowTopmost(HWND hWnd,BOOL top)
... {
if(top)
return SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
else
return SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
}
6、设置鼠标穿透 (返回顶部)
void SetShuBiaoChuanTou(HWND hWnd,BOOL Status)
... {
if(Status)
...{
//鼠标穿透
LONG dwNewLong = GetWindowLong(hWnd, GWL_EXSTYLE);
dwNewLong |= WS_EX_TRANSPARENT | WS_EX_LAYERED;
SetWindowLong(hWnd, GWL_EXSTYLE, dwNewLong);
}
else
...{ //取消穿透
LONG dwNewLong = GetWindowLong(hWnd, GWL_EXSTYLE);
dwNewLong &= ~WS_EX_TRANSPARENT;
SetWindowLong(hWnd, GWL_EXSTYLE, dwNewLong);
}
}
7、VC用字符串截取字符串的函数(比AfxExtractSubString更好)
8、读取整型内存数据 (返回顶部)
int ReadIntMemory(HWND hWnd,DWORD offset)
... {
int *lpBuffer=NULL;
SIZE_T nSize=sizeof(int);
DWORD IdThread;
MEMORY_BASIC_INFORMATION mbi;
BYTE baseAddress = 0;
int IntValue=0;
::GetWindowThreadProcessId(hWnd,&IdThread);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,IdThread);
::VirtualQueryEx(hProcess,&baseAddress, &mbi, sizeof(mbi));
::ReadProcessMemory(hProcess,(LPCVOID)(baseAddress+offset),(PVOID)&IntValue,nSize,NULL);
if(lpBuffer)
*lpBuffer=IntValue;
::CloseHandle(hProcess);
return IntValue;
}
9、关机函数, 适用9X和NT (返回顶部)
void EnableDebugPriv()
... {
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return;
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
...{
CloseHandle( hToken );
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
CloseHandle( hToken );
}
// 判断当前操作系统是否为NT系统,是则返回真,否(即是win9x系统)则返回否
BOOL IsWin2000()
... {
OSVERSIONINFO winInfo;
winInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&winInfo);
if (winInfo.dwMajorVersion == 5) //win2000 or winXP
return TRUE;
else
return FALSE;
}
// 关机函数, 适用9X和NT
void ShutDownSys()
... {
EnableDebugPriv();
if (IsWin2000())
WinExec("ShutDown -s -f -t 0 -c " WINDOWS将在上面的时间内关机,请做好保存工作!"", SW_SHOW);
else
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_POWEROFF,NULL);
//ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
}
10、将16进制字符串转换为10进制数值 (返回顶部)
long int String16ToInt10( CString str16 )
... {
long int temp=0;
//CString strKeyValue = chKey;
//str16[1];
for(int i = 0; i< str16.GetLength(); i++)
...{
int nDecNum;
switch(str16[i])
...{
case 'a':
case 'A': nDecNum = 10; break;
case 'b':
case 'B': nDecNum = 11; break;
case 'c':
case 'C': nDecNum = 12; break;
case 'd':
case 'D': nDecNum = 13; break;
case 'e':
case 'E': nDecNum = 14; break;
case 'f':
case 'F': nDecNum = 15; break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': nDecNum = str16[i] - '0'; break;
default: return temp;
}
temp += nDecNum * (int)pow((double)16,str16.GetLength()-i -1);
}
return temp;
}
11、在CTreeCtrl中使用32位色的图标 (返回顶部)
原文见http://www.codeproject.com/KB/tree/TreeHighIcon.aspx
In your dialog class header, just add two attributes:
CImageList m_imageList; //image list used by the tree
CBitmap m_bitmap; //bitmap witch loads 32bits bitmap
At the end of InitDialog
// Create a 32bits ImageList
m_imageList.Create (16, 16, ILC_COLOR32 , 1,1);
//Add the bitmap to the ImageList
m_bitmap.LoadBitmap(IDB_BITMAP_HIGHCOLOR);
m_imageList.Add(&m_bitmap, RGB(255,0,255));
//Manage your tree items......
m_tree.SetImageList (&m_imageList, TVSIL_NORMAL);
m_tree.InsertItem("RootItem",0,0,TVI_ROOT);