السلام عليكم ورحمة الله ,,,
دائما عندما يبدأ أحدنا في تعلم لغة برمجة فإنة يبحث عن طريقة كتابة الأوامر
فيها , وتجدة يفتح الكود لزر الأمر ولا يعرف مايكتب بداخلة ,,,
فما رأيكم بأن نبدأ بمجموعة من الأكواد والأفكار تعتمد على دوال API ,
تكون مكتوبة بلغة السي , لكي نتعرف على سهولة هذة اللغة
ملاحظة : جميع الدوال و الأفكار التي سنكتبها تستطيع إستخدامها في الدلفي و الفيجول بيسك وحتى منصة الدت نت ,, لأن دوال API لا تختلف في أي مترجم لوندوز
تستطيع إستخدام مشروع MFC وتضع زر أمر وتكتب الأكواد بداخلة
بالإضافة إلى أنك تستطيع فتح مشروع Win32 فارغ وتكتب مباشرة في الدالة الرئيسية main , أو تصنع نافذة وبها زر أمر وتكتب الأكواد بداخلة
لأنك ستلاحظ بأن بعض الدوال تبدأ بنقطتين رأسيتين : للتوافقية بين إختلاف أنواع المشاريع ,,, المهم قص وألصق ... ونفذ الأمر
بسم الله نبدأ :
1- مثال لإيجاد أهم المسارات التي يستخدمها البرنامج :
TCHAR OSDir[MAX_PATH]; // عرض مسار الوندز GetWindowsDirectory (OSDir,MAX_PATH); ::MessageBox (NULL,OSDir,"1",MB_OK); // عرض مسار ملفات النظام GetSystemDirectory (OSDir,MAX_PATH); ::MessageBox (NULL,OSDir,"2",MB_OK); // عرض مسار البرنامج الحالي GetModuleFileName (NULL,OSDir,MAX_PATH); ::MessageBox (NULL,OSDir,"3",MB_OK);
2 - مثال لسرد الملفات والمجلدات في دليل معين
WIN32_FIND_DATA fdata;
HANDLE hfind;
hfind=FindFirstFile ("d:\\*.*", &fdata);
if(hfind==INVALID_HANDLE_VALUE)
{
// حدوث خطأ في الدالة أو عدم وجود ملفات للعرض
::MessageBox (NULL,"Error","Dir",MB_OK);
}
else
{
do{
::MessageBox (NULL,fdata.cFileName,"Dir",MB_OK);
}while(FindNextFile (hfind,&fdata));
}
FindClose (hfind);3 - عرض العمليات والبرامج الموجودة حاليا في الذاكرة
يلزمك تعريف في بداية صفحة الكود وهو
#include <tlhelp32.h>
وبعد ذلك تكتب الكود
HANDLE hthsnt;
PROCESSENTRY32 penn;
hthsnt=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Process32First(hthsnt,&penn);
do{
::MessageBox (NULL,penn.szExeFile ,"proc",MB_OK);
}while(Process32Next(hthsnt,&penn));
CloseHandle (hthsnt);4 - إظهار قائمة منسدلة بمجرد الضغط على زر الأمر
HMENU mnu; POINT po; mnu = CreatePopupMenu (); AppendMenu (mnu,MF_STRING,1,"Open"); AppendMenu (mnu,MF_STRING,2,"Save"); AppendMenu (mnu,MF_STRING,3,"Load"); GetCursorPos (&po); TrackPopupMenu(mnu,TPM_LEFTALIGN,po.x ,po.y,0,mHwnd,NULL); DestroyMenu (mnu);
البارمتر mHwnd يمثل مقبض النافذة الرئيسية التي تحتوي على زر الأمر
إذا كنت تستخدم MFC إكتب في هذا البارمتر this->m_hWnd
5 - سرد القيم والمعلومات لمفتاح معين في الريجستري
وسنقوم بعرض البرامج التي تعمل في بداية تشغيل الوندوز , يمكن أن تغير المفتاح
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY hky;
long rel;
rel=RegOpenKeyEx (HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_READ,&hky);
if(rel==0)
{
TCHAR strval[MAX_PATH];
TCHAR strdat[MAX_PATH];
DWORD szofval=MAX_PATH;
DWORD szofdat=MAX_PATH;
DWORD ntyp;
DWORD ind=0;
while (RegEnumValue (hky,ind,strval,&szofval,NULL,&ntyp,(BYTE*)strdat,&szofdat)==0)
{
::MessageBox (NULL,strdat,strval,MB_OK);
szofval=MAX_PATH;
szofdat=MAX_PATH;
ZeroMemory(strval,MAX_PATH);
ZeroMemory(strdat,MAX_PATH);
ind++;
}
}
RegCloseKey (hky);6 - إظهار نافذة لإستعراض الملفات وإختيار ملف نصي
ويجب تعريف ملف ,, إذا كنت تستخدم مشروع MFC لا يتطلب
#include <commdlg.h>
static OPENFILENAME Textopen; static TCHAR szFileTitle[MAX_PATH]; static TCHAR szFile[MAX_PATH] ; static TCHAR szDefExt[MAX_PATH] ; ZeroMemory(&Textopen,sizeof(OPENFILENAME)); ZeroMemory(szFile,MAX_PATH); ZeroMemory(szFileTitle,MAX_PATH); ZeroMemory(szDefExt,MAX_PATH); Textopen.lStructSize =sizeof(OPENFILENAME); Textopen.hwndOwner =(HWND)NULL; Textopen.hInstance =(HINSTANCE)NULL; Textopen.lpstrFile =szFile; Textopen.lpstrFileTitle =szFileTitle; Textopen.lpstrDefExt =szDefExt; Textopen.lpstrTitle ="Select an Text file"; Textopen.lpstrFilter ="Executable file (*.txt)\0*.txt\0Any file (*.*)\0*.*\0\0"; Textopen.lpstrInitialDir =NULL; Textopen.lpstrCustomFilter=NULL; Textopen.lpTemplateName =NULL; Textopen.nMaxFile =MAX_PATH; Textopen.nMaxFileTitle =MAX_PATH; Textopen.nMaxCustFilter=NULL; Textopen.Flags =OFN_HIDEREADONLY; Textopen.lCustData =NULL; Textopen.lpfnHook =(LPOFNHOOKPROC)NULL; Textopen.nFileExtension=0x0000; Textopen.nFileOffset =0x0000; Textopen.nFilterIndex =0L; if(GetOpenFileName ((LPOPENFILENAME)&Textopen)) ::MessageBox (NULL,Textopen.lpstrFile,NULL,MB_OK);
7 - هذا المثال تكملة للمثال السابق , سنقوم بقرائة محتوى الملف النصي الذي
سيتم إختيارة , لاحظ : سيتم التغيير من عند الدالة GetOpenFileName
if(GetOpenFileName ((LPOPENFILENAME)&Textopen))
{
HANDLE hfile=INVALID_HANDLE_VALUE;
DWORD szbyte,nbb;
LPTSTR data=NULL;
hfile=CreateFile (Textopen.lpstrFile,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING ,0,NULL);
if(hfile!=INVALID_HANDLE_VALUE)
{
szbyte=GetFileSize (hfile,NULL);
data=(LPTSTR)VirtualAlloc (NULL,szbyte,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
if(data) {
ReadFile (hfile,data,szbyte,&nbb,NULL);
::MessageBox (NULL,data,"data",MB_OK);
VirtualFree (data,0,MEM_RELEASE);
}
}
CloseHandle (hfile);8 - عرض لوحة الألوان لإختيار لون
CHOOSECOLOR cc; COLORREF rgbrr; cc.lStructSize = sizeof(CHOOSECOLOR); cc.hwndOwner = NULL; cc.hInstance=NULL; cc.Flags = CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT; cc.lpCustColors=&rgbrr; cc.rgbResult =RGB(255,0,0); ChooseColor (&cc);
9- عرض المسارات الفرعية للمستخدم
ويتطلب تعريف ملف , إذا كنت تستخدم MFC لا يحتاج أن تضيف شيء
#include <shlobj.h>
LPITEMIDLIST lp; TCHAR path[MAX_PATH]; /// عرض مسار سطح المكتب للمستخدم SHGetSpecialFolderLocation(NULL ,CSIDL_DESKTOP ,&lp); SHGetPathFromIDList (lp,path); ::MessageBox (NULL,path,"path",MB_OK); /// عرض مسار مجلد الخطوط SHGetSpecialFolderLocation(NULL ,CSIDL_FONTS ,&lp); SHGetPathFromIDList (lp,path); ::MessageBox (NULL,path,"path",MB_OK); /// عرض مسار الكوكيز SHGetSpecialFolderLocation(NULL ,CSIDL_COOKIES ,&lp); SHGetPathFromIDList (lp,path); ::MessageBox (NULL,path,"path",MB_OK); /// عرض مسار الحافظة SHGetSpecialFolderLocation(NULL ,CSIDL_HISTORY ,&lp); SHGetPathFromIDList (lp,path); ::MessageBox (NULL,path,"path",MB_OK); /// عرض مسار المفضلة SHGetSpecialFolderLocation(NULL ,CSIDL_FAVORITES ,&lp); SHGetPathFromIDList (lp,path); ::MessageBox (NULL,path,"path",MB_OK); /// عرض مسار الكاش للمتصفح SHGetSpecialFolderLocation(NULL ,CSIDL_INTERNET_CACHE ,&lp); SHGetPathFromIDList (lp,path); ::MessageBox (NULL,path,"path",MB_OK); /// عرض مسار قائمة بدء التشغيل SHGetSpecialFolderLocation(NULL ,CSIDL_STARTUP,&lp); SHGetPathFromIDList (lp,path); ::MessageBox (NULL,path,"path",MB_OK);
وتوجد مسارات أخرى فقط إستبدل القيم
CSIDL_SENDTO
CSIDL_RECENT
CSIDL_PROGRAMS
CSIDL_PRINTHOOD
CSIDL_PRINTERS
CSIDL_PERSONAL
CSIDL_NETWORK
CSIDL_DRIVES
CSIDL_CONTROLS
CSIDL_BITBUCKET
CSIDL_APPDATA
CSIDL_TEMPLATES
CSIDL_ALTSTARTUP
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_COMMON_FAVORITES
CSIDL_COMMON_PROGRAMS
CSIDL_COMMON_STARTMENU
ولآن قم بدمج الأفكار لتحصل على برنامج
مثلا هذة الفكرة والفكرة 2 لعرض ملفات الكويكز في الجهاز ومعرفة المواقع التي تمت زيارتها
عن طريق عرض محتوى الحافظة أو عن طريق سرد قيم الريجستري في الفكرة 5
---------------
10 - إيجاد المساحة الحرة في القرص
DWORD aa,bb,cc,dd;
DWORD nbyte=0;
TCHAR show[MAX_PATH];
GetDiskFreeSpace("d:\\",&aa,&bb,&cc,&dd);
nbyte=(cc*aa)*bb;
ZeroMemory(show,100);
itoa(nbyte,show,10); // هذة المايكرو لتغيير الأرقام إلى حروف
::MessageBox (NULL,show,"Free",MB_OK);11 - عرض المعلومات الفيزيائية عن القرص مثلا عدد السلندرات والقطاعات
ورأس الكتابة والتجمعات و..و , يجب إضافة ملف تعريف في بداية الصفحة وهو
#include <winioctl.h>
ثم قم بكتابة
DWORD cb;
DISK_GEOMETRY pF={0};
TCHAR data[100];
HANDLE hDevs;
hDevs=CreateFile ("\\\\.\\C:",GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,0,NULL);
if(hDevs!=INVALID_HANDLE_VALUE)
{
DeviceIoControl (hDevs,IOCTL_DISK_GET_DRIVE_GEOMETRY
,NULL,0,&pF,sizeof(pF),&cb,0);
// عدد المسارات في السلندر أو الإسطوانة
ZeroMemory(data,100);
itoa(pF.TracksPerCylinder ,data,10);
::MessageBox (NULL,data,"TracksPerCylinder",MB_OK);
//عدد البايتات في القطاع
ZeroMemory(data,100);
itoa(pF.BytesPerSector ,data,10);
::MessageBox (NULL,data,"BytesPerSector",MB_OK);
/// ومعلومات أخرى تجدها في البنية
}
CloseHandle (hDevs);12 - عرض الأقسام في مقدمة القرص وبعض المعلومات الفيزيائية
تستفيد من هذة الدالة في معرفة الأنظمة الموجودة على القرص مثلا وندوز أو لينكس أو كم نظام بالإضافة إلى نوع نظام الملفات ومعلومات أخرى
DWORD cb;
PARTITION_INFORMATION pF={0};
TCHAR data[100];
HANDLE hDevs;
hDevs=CreateFile ("\\\\.\\C:",GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,0,NULL);
if(hDevs!=INVALID_HANDLE_VALUE)
{
DeviceIoControl (hDevs,IOCTL_DISK_GET_PARTITION_INFO
,NULL,0,&pF,sizeof(pF),&cb,0);
// عدد أقسام القرص
ZeroMemory(data,100);
itoa(pF.PartitionNumber ,data,10);
::MessageBox (NULL,data,"PartitionNumber",MB_OK);
// عدد القطاعات المخفية
ZeroMemory(data,100);
itoa(pF.HiddenSectors ,data,10);
::MessageBox (NULL,data,"HiddenSectors",MB_OK);
}
CloseHandle (hDevs);وتحتوي البنية على معلومات أخرى مثل نوع القسم pF.PartitionType
وهو يأخذ أحد القيم التالية
PARTITION_ENTRY_UNUSED :Entry unused. PARTITION_FAT_12 :Specifies a partition with 12-bit FAT entries. PARTITION_XENIX_1 :Specifies a Xenix type 1 partition. PARTITION_XENIX_2 :Specifies a Xenix type 2 partition. PARTITION_FAT_16 :Specifies a partition with 16-bit FAT entries. PARTITION_EXTENDED : Specifies an extended partition entry. PARTITION_HUGE :Specifies an MS-DOS V4 huge partition. PARTITION_IFS :Specifies an IFS partition. PARTITION_PREP :Specifies a PowerPC Reference Platform partition. PARTITION_UNIX :Specifies a UNIX partition. VALID_NTFT :Specifies an NTFT partition. PARTITION_XINT13 : Windows 95 and Windows 98
أعتقد بأنا خرجنا عن المستوى المحدد لهذا الموضوع , وكنا سندخل في الإسمبلي :)
المهم بقيت دالتين ونرجع للأفكار السريعة
حالة منافذ الإتصال للهاردوير , مثل COM1 , COM2... وأهم شيء حالة وخصائص المودم
13 - لمعرفة حالة المودم بشكل تفصيلي , مثل سرعة النقل
وحجم بايت النقل وبايت التحكم والحماية و بروتكول النقل و..و
HANDLE hDev;
TCHAR data[100];
// ملاحظة قد يتغير رقم المنفذ , على حسب منفذ المودم
hDev=CreateFile ("\\\\.\\COM1",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if(hDev!=INVALID_HANDLE_VALUE )
{
DCB dcb;
dcb.DCBlength =sizeof(dcb);
GetCommState(hDev,&dcb);
// تجد كل هذة المعلومات في هذة البنية dcb
//
}
CloseHandle (hDev);خصائص المنافذ للهاردوير
والطريقة مشابهة للكود السابق فقط غير البنية والدالة إلى
COMMPROP
GetCommProperties
----------------------------------------------
نرجع للأفكار السريعة والمفيدة ,,,
14 - نقل المتصفح لموقع أو عرض صفحة إنترنت
ShellExecute (NULL,"open",(LPCTSTR)"www.arabteam2000.com",NULL,NULL,SW_SHOW);
15- أسهل طريقة لتشغيل ملف تنفيذي
WinExec ("D:\\DIALOG.exe",SW_SHOW);16 - طريقة إفراغ سلة المحذوفات
SHEmptyRecycleBin (NULL,NULL,NULL);
---------------
وبالتأكيد بقية أفكار ودوال كثيرة , لو كل عضو يكتب كود واحد يمكن نخلصها ؟؟!
المهم : أتمنى المشاركة من الأعضاء ليكون مرجع للمبتدئين في لغة السي
وبالتوفيق ,,,
