由于自己不是专业的程序员,对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喇叭演奏音乐 (返回顶部 )
//
通过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 即可
例:
void
main()
/**/
/* 用PC喇叭演奏“生日快乐” */
...
{ 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、向指定窗口发送文本内容 (返回顶部 ) 【我将其用于网游的自动喊话中】
//
向指定窗口发送文本内容,非Unicode版本
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
(返回顶部 )
//
提升进程权限以便可以使用ExitWindowsEx函数进行关机操作
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进制数值 (返回顶部 )
//
将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);