‏نمایش پست‌ها با برچسب api. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب api. نمایش همه پست‌ها

۱۳۸۸ تیر ۱۱, پنجشنبه

رجیستری

حتما شما هم تا حالا اسم رجیستری به گوشتون خورده و باهاش آشنایی دارید.
رجیستری ویندوز رو میشه از طریق برنامه ی regedit درش تغییراتی به وجود آورد.
همچنین یکسری توابع api نیز ویندوز داره که به وسیله ی اونا میتونین از داخل برنامه ی خودتون رجیستری رو تغییر بدید. 
حالا یک پروژه ی جدید باز کنید چون میخوایم در غالب یک پروژه قسمت عمده ی این توابع رو یادبگیریم(بگیرید چون من که بلدم (:   )
خب خیلی طبیعیه که برای کار کردن با یک رشته یا عدد از یک فایل دیگه اول اون رو باز کنیم.
برای این کار تابعی به نام RegOpenKeyEx وجود داره به شکل زیر

Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long

اگر برنامه ی regedit رو باز کنید میبینید که وقتی اولین شاخه یعنی شاخه ی MyComputer رو باز میکنید پنج فولدر مشاهده میکنید.(از این به بعد به این فولدر ها میگیم key یا "کی" که به فارسی یعنی کلید.پس میگیم کلید ،فولدر تو رجیستری=کلید)
خب اگر در APIViewer خود در لیست ثابت ها(constants) نگاه کنید میبینید هشت کلید با نام کلید های ذکر شده وجود دارد که با سه تا از اونا کاری نداریم.
بقیه یه اونها به شرح زیر
Public Const HKEY_CLASSES_ROOT As Long = &H80000000
Public Const HKEY_CURRENT_CONFIG As Long = &H80000005
Public Const HKEY_CURRENT_USER As Long = &H80000001
Public Const HKEY_LOCAL_MACHINE As Long = &H80000002
Public Const HKEY_USERS As Long = &H80000003

قبل از اینکه سراغ کد نویسی برم این رو هم بگم که اگر مقدار برگشتی هرکدوم از توابع API مربوت به رجیستری مقدار 0 رو برگردونن یعنی تابع کارش رو با موفقیت به انجام رسونده و در غیر این صورت یعنی خطایی رخ داده.
خب بریم که یک کلید رو باز کنیم.
دونه دونه مقادیری رو که برای regopenkeyex نیاز دارید در پایین توزیح میدم
hKey=یکی از همون پنج ثابت
lpSubKey=نام کلیدی که میخواهیم اون رو باز کنیم
ulOptions=فقت یک صفر بزارید
samDesired=یک پوشش امنیتی که  یه چندتا ثابت میخواد به شرح زیر.
Public Const KEY_ALL_ACCESS As Long = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
Public Const STANDARD_RIGHTS_ALL As Long = &H1F0000
Public Const KEY_QUERY_VALUE As Long = &H1
Public Const KEY_SET_VALUE As Long = &H2
Public Const KEY_CREATE_SUB_KEY As Long = &H4
Public Const KEY_ENUMERATE_SUB_KEYS As Long = &H8
Public Const KEY_NOTIFY As Long = &H10
Public Const KEY_CREATE_LINK As Long = &H20
Public Const SYNCHRONIZE As Long = &H100000

شما فقت KEY_ALL_ACCESS رو مینیویسید ولی  ثابت های دیگر رو هم باید  توی ماژول یا جای دیگه نوشته باشید.
 و اگر نگاه کنید تمامی ثوابت توی خود  KEY_ALL_ACCESS  هستند پس  فقت کافیه KEY_ALL_ACCESS رو حفظ کنید.
و اینکی KEY_ALL_ACCESS باید بعد از ثوابط دیگر تعریف شود
phkResult=هندل کلیدی رو که باز کردیم بر میگرداند.
حالا برید تو رویداد Form1_Load و کد زیر رو بنویسید
Private Sub Form_Load()
Dim RetVal As Long
Dim SubKey As String
Dim KeyHandle As Long
SubKey = "console"
RetVal = RegOpenKeyEx(HKEY_CURRENT_USER, SubKey, 0, KEY_ALL_ACCESS, KeyHandle)
If Not RetVal = 0 Then
  MsgBox "error in openning"
  End
Else
  MsgBox "openning succeded"
  End
End If
End Sub

برنامه اول سأی میکنه که کلید console که در Hkey_Current_User هست رو باز کنه و اگه موفق شد هندل اون رو در متغیر KeyHandle قرار میده . ولی اگه با خطا مواجه شد اول میگه که در بازکردن مشکل به وجود آمده و بعد برنامه رو میبنده.
اگر هم که با خطا مواجه نشد  میگه که باز شدن با موفقیت انجام شد و بعد برنامه رو میبنده.
نکته:وقتی که یک کلید رجیستری رو باز میکنید یه مقداری رم رو به خودش اختصاص میده به همین علت وقتی یک کلید رجیستری باز شد و خوانده شد یا  تغییراتی درش به وجود آمد بای سریع بسته شه که رم رو  آزاد کنه .بستن  یک کلید رجیستری به وسیله ی یک API یه  دیگه انجام میشه ولی چون هنوز اون رو نخوندیم برنامه رو میبندیم و باز هم رم به این ترتیب آزاد میشه.
خب حالا میخوایم یک  مقدار(value) رو بخونیم.مقادیر رو در قسمت سمت راست  برنامه ی regedit مشاهده میکنید که متنها و عدد ها در انها ذخیره میشوند.
برای خواندن یک مقدار از تابع RegQueryValueEx استفاده میکنیم به شکل زیر.
 

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
خب حالا به به شرح آرگومان هاش میپردازیم
hKey=هندل کلید باز شده به وسیله ی RegOpenKeyEx
lpValueName=نام مقداری(value)ای که میخواهیم اونو باز کنیم
lpReserved=صفر
lpType=تایپ مقداری که میخواهیم باز کنیم که یه چندتا ثابت با پیشوند REG داره
Public Const REG_BINARY As Long = 3
Public Const REG_DWORD As Long = 4
Public Const REG_SZ As Long = 1
البته تایپ های دیگری هم وجود داره ولی اینا مهمترین هان
REG_SZ=مقادیر رشته ای
REG_BINARY=مقادیر دودویی
REG_DWORD=مقادیر Hex یا decimal
بقیه یه آرگومان 
lpData=متغیری که مقدار برگشتی به آن فرستاده میشود
lpcbData=طول مقدار برگشتی
خب دو آرگومان آخر یکم توضیح میخوان
برای بدست آوردن مقدار دو راه وجود دارد که من به این روش عمل میکنم
اول دو متغیر از نوع استرینگ(string) تعریف میکنیم
حد اکثر طول یکی از آنها رو مساوی با 255 قرار میدیم به شکل زیر
Dim Buff As String *255
Dim RegValue as String
بعد برای lpData متغیر اولی رو مینویسیم
برای lpcbData هم حد اکثر طول متغیر اولی رو مینویسیم
گیج نشید الان مثال میزنم متوجه میشید.
Private Sub Form_Load()
Dim RetVal As Long
Dim Buff As String * 255, Fn As String
RetVal = RegQueryValueEx(KeyHandle, ValueName, 0,  REG_SZ, ByVal Buff, 255)
If RetVal = 0 Then
  Fn = Left(Buff, 255)
Else
  MsgBox "error in reading", vbCritical, "error"
  End
End If
End Sub
بعد با دستور RegCloseKey باید کلید بسته بشه
بستن کلید خیلی سادس.فقط هندل کلیدی رو که باز کردین بهش بدین


۱۳۸۷ اسفند ۱۹, دوشنبه

bitblt

امروز میخوام یکی از توابع معروف رو براتون توضیحش رو بزارم که حال مضاعفی ببریم.توی اکثر جاها اگه بخواید آموزش این تابع رو یادبگیرید با نگاه اول به متن اون آموزش مختون سوت میکشه ولی باید بدونید که یکی از توابع ساده هستش.خب حرف بسه بریم سراغ اصل مطلب.
فرمت تابع bitblt به شکل زیر هستش.
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

البته اگه میخواید توی ماژول تعریفش کنید معمولآ باید بجای private از public استفاده کنید.
حالا به ترتیب توضیحشون میدم.
hDestDC=اچ دی سی (hdc) کنترلی که عکس به اون منتقل میشه.یعنی عکس ما توش کپی میشه.
x=نقطه ی شروع ترسیم(عکس جدید)در راستای افقی.
y=نقطه ی شروع ترسیم(عکس جدید)در راستای عمودی.
nWidth=عرض تصویر جدید.
nHeight=طول تصویر جدید.
hSrcDC=اچ دی سی (hdc) کنترلی که تصویر از اونجا کپی میشه(کنترل مبدع).
xSrc=نقطه ی شروع کپی شدن در راستای افق عکس(کنترل مبدع)
ySrc=نقطه ی شروع کپی شدن عکس در راستای عمود(کنترل مبدع)
dwRop=یک ثابت(constant)که در زیر توضیح داده شده.
تعداد زیادی ثابت وجود داره ولی ما با تابع زیر شروع میکنیم.این تابع عکس رو بدون هیچ دستکاری از کنترل مبدع به کنترل مقصد کپی میکنه.
Private Const SRCCOPY As Long = &HCC0020

در زیر یک نمونه اورده شده است.
  BitBlt Picture2.hDC, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hDC, 0, 0, SRCCOPY

به ثابت روبه رو نگاه کنید.              Public Const MERGEPAINT = &HBB0226
این ثابت به رنگ پس زمینه ی کنترلی که عکس در آن کپی میشود بستگی دارد.
رنگ backcolor کنترل مقصدرو عوض کنید و بعد عکس رو کپی کنید و نتیجه رو ببینید.
ثابتت زیر رنگ عکس کپی شده رو عوض میکنه ولی با backcolor کاری نداره.
Public Const NOTSRCCOPY = &H330008
همون طور که گفتم برای این تابع ثوابت زیادی وجود داره که در زیر لیست شدن.ولی از توضیح دادن همه ی آنها معذورم.البته خودتون راحت میتونید دونه دونه امتحانش کنید.
Public Const BLACKNESS = &H42
Public Const DSTINVERT = &H550009
Public Const MERGECOPY = &HC000CA
Public Const MERGEPAINT = &HBB0226
Public Const NOTSRCCOPY = &H330008
Public Const NOTSRCERASE = &H1100A69
Public Const SRCAND = &H8800C6
Public Const SRCCOPY = &HCC0020
Public Const SRCERASE = &H440328
Public Const SRCINVERT = &H660046
Public Const SRCPAINT = &HEE0086
Public Const WHITENESS = &HFF0062


۱۳۸۷ بهمن ۱۰, پنجشنبه

windowfrompoint

در پست قبلی نحوه ی کار با پنجره ها رو توضیح دادم .هم چنین نحوه ی بدست آوردن محل کرسر رو هم آموزش دادم. حالا میخوام یک کد باحال رو آموزش بدم که فقط با استفاده از محل پنجره هندل اون رو به شما بده.خب دو تا مطلب قبلی یا همون پست قبلی رو اینجا استفاده میکنیم بعلاوه ی تابع windowfrompoint .نیازی ه توضیح نداره پس به کد زیر بسنده میکنم.

مواد لازم:1 عدد فرم - 1 عدد تایمر - لیبل(label)به میزان لازم.

()Private Sub Timer1_Time
Dim wnd As Long
Getcursorpos pointapi
(wnd=Windowfrompoint (pointapi.x,pointapi.y
Label1.caption=wnd
End Sub

۱۳۸۷ بهمن ۵, شنبه

getcursorpos

برای بدست آوردن محل کرسر ویندوز از تابع getcursorpos استفاده میکنیم.
برای این کار نیاز به یک تایپ داریم به اسم pointapi .
پس توی جنرال برنامه کد زیر رو کپی کنید.

Private Type POINAPI
x as integer
y as integer
End Type
Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
dim POINTAPI as POINTAPI

حالا یک تایمر بزارید و توی روالش کد زیر رو بنویسید.(اول interval اون رو 100 بکنید)

getcursorpos POINTAPI
text1.text=POINTAPI.x
text2.text=POINTAPI.y

یادم رفت که بگم دوتا textbox هم بزارید.

۱۳۸۷ دی ۲۹, یکشنبه

windows

بحث پنجره ها مبحث بزرگی است.

برای شروع یک توزیح کلی میدم.

هر چیز در ویندوز یک پنجذه هست. هر پنجره یک هندل(handle) یا دستگیره دارد . هندل ها همیشه long هستند و متغیری که یک هندل به ان نسبت داده میشود باید از نوع long تعریف شده باشد.بریم سراغ اصل مطلب.



برای گرفتن هندل یک پنجره از تابعی به نام findwindow استفاده میکنیم.(چند تا دیگه هم هستن)

یاد گرفتن این تابع خیلی آسونه.این تابع از شما دو چیز میخواهد

1-نام پنجره

2-نام کلاس پنجره

شما باید فقت یکی رو پر کنید و در دیگری بنویسید VbNullString به مثال پایین نگاه کنید



findwindow(VbNullString,"visualbasic")

پس به روش زیر میتوان هندل یک پنجره رو گرفت.

dim a as long
a=findwindow(vbnullstring,windowname)

حالا با استفاده از تابع showwindow میشه پنجره رو دستکاری کرد.
این تابع هم ساده هست.چون فقت ندل پنجره و فلگ کاری که میخواد بکنه رو نیاز داره. فلگ هارو در زیر اوردم.
sw_show نمایش پنجره
sw_hide پنهان کردن پنجره
sw_maximize بزرگ کردن صفحه
sw_minimize کوچک کردن صفحه
این یکی جداّ نیاز به توزیح نداره ولی توزیح میدم واسه اوش گ...ها.

dim wnd as long
wnd=findwindow(vbnullstring)
showwindow wnd,sw_hide
به این ترتیب یک پنجره رو مخفی میکنیم.دقت داشته باشید که پنجره مخفی(hide)میشه.

۱۳۸۷ آذر ۲۹, جمعه

windows colors

خب حالا میخواهیم یکمی سیستم رنگ بندی کامپیوتر رو دست کاری کنیم.
برای این کار از یک api به نام setsyscolors استفاده میکنیم.
خیلی کارساده ای هست فقت باید نام یک فلگ و یک عدد از نوع long که همان رنگ هست رو بهش بدین.

Private Declare Function SetSysColors Lib "user32.dll" (ByVal nChanges As Long,_ ByRef lpSysColor As Long, ByRef lpColorValues As Long) As Long

و فلگ هاش هم در زیر اومده.

private Const COLOR_3DDKSHADOW As Long = 21
private Const COLOR_3DLIGHT As Long = 22
private Const COLOR_ACTIVEBORDER As Long = 10
private Const COLOR_ACTIVECAPTION As Long = 2
private Const COLOR_BACKGROUND As Long = 1
private Const COLOR_BTNSHADOW As Long = 16
private Const COLOR_BTNTEXT As Long = 18
private Const COLOR_CAPTIONTEXT As Long = 9
private Const COLOR_HIGHLIGHT As Long = 13
private Const COLOR_HIGHLIGHTTEXT As Long = 14
private Const COLOR_HOTLIGHT As Long = 26
private Const COLOR_MENU As Long = 4
private Const COLOR_MENUTEXT As Long = 7
private Const COLOR_SCHEMES As Long = 715
private Const COLOR_SCROLLBAR As Long = 0
private Const COLOR_WINDOW As Long = 5
private Const COLOR_WINDOWFRAME As Long = 6
private Const COLOR_WINDOWTEXT As Long = 8

توضیح دادن اینکه هرکدام از اینها چا کار میکنند کار سختی پس خودتون دونه دونه امتحانشون کنید.
(getsystemcolors(flag
دستور بالا هم رنگ کلمپوتر رو میگیرد

۱۳۸۷ آذر ۱۵, جمعه

popup menu

اگر میخواهید وقتی کاربر بر روی فرم شما رایت کلیک میکنه یک منو باز بشه این مطلب رو بخونید.
اول یک منو درست کنید.
بعد visible اون رو false کنید.
(activex.poumpmenu(menu as object,flgas,x,y,defult menu
کد بالا برای اضافه کردن منو به یک ابزار است.
activex همون ابزاری هست که میخواهید منو رو به اون اضافه کنید.
menu as object که در این قسمت فقت اسم منو رو بنویسید.
بقیه هم فدا سرتون.
(private sub form1_mousedown(button as integer,shift as integer,x as string,y as string
If button=2 Then
form1.proumpmenu file
END IF
End Sub

۱۳۸۷ آذر ۱۴, پنجشنبه

LoadKeyboardLayout

برای عوض کردن زبان ویندوز از این api استفاده میکنیم .
Private Declare Function LoadKeyboardLayout Lib "user32.dll" Alias_ "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
و یک flag 
Private Const LANG_FARSI As Long = &H29

()private sub form1_load
LoadKeyboardLayout "00000429", 1
end sub

کد بالا زبان keyboard رو از انگلیسی به فارسی تغییر میده.

exitwindowex

امروز یه کد جالب میخوام بذارم که به وسیله ی اون میشه کارهای زیر رو انجام داد .
1- shut down
2- restart
3-log off
 برای این کار نیاز به چهار فلگ و یک  api داریم .
حالا api viewer رو بیارید و کد exitwindowex رو به دست بیارید .
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal_ dwReserved As Long) As Long

و flag های زیر.
EWX_FORCE
EWX_SHUTDOWN
EWX_REBOOT
EWX_LOGOFF
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4

حالا به کدهای زیر توجه کنید .
(ret&=exitwindowsex(EWX_FORCE + EWX_SHUTDOWN
(ret&=exitwindowsex(EWX_FORCE + EWX_LOGOFF
(ret&=exitwindowsex(EWX_FORCE + EWX_REBOOT
توجه : EWX_FORCE  برای دستوری کردن و عملی کردن به کار میرود .

۱۳۸۷ آذر ۴, دوشنبه

swap mouse button

همان طور که از اسم این api مشخص هستش برای عوض کردن راست کلیک و چپ کلیک به کار میره.
اول کد اون رو تو general برنامه کپی کنید.

Private Declare Function SwapMouseButton Lib "user32.dll" (ByVal bSwap As Long) As Long

کد زیر چپ کلیک و راست کلیک رو عوض میکنه

SwapMouseButton 0

کد پایین راست کلیک و چپ کلیک رو به حالت عادی در میاره .

swapmousebutton 1

۱۳۸۷ آبان ۳۰, پنجشنبه

باز و بسته کردن در سی دی رام

خوب کسانی که با api viewr آشنایی دارن اون رو باز کنن .
حالا عبارت mcisendstring رو تایپ کنن و کد مریوط به اون رو کپی کنید .
برنامه ی ما از یک فرم به نام form1 و دو دکمه به نام های command1 , command2 تشکیل شده .
حالا کد زیر رو که قبلا کپی کرده بودید داخل general مربوط به form1 کپی کنید.(نتیجه به شکل زیر خواهد بود)

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal_ lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long,_ ByVal hwndCallback As Long) As Long

برای command1 کد زیر رو بنویسید.

() private sub command1_click
mcisendstring "set cdaudiodoor open wait",0,0,0
End sub

برای command2 کد زیر رو بنویسید

()Private Sub Command2_Click
mcisendstring "set cdaudiodoor close wait", 0, 0, 0
End sub

Input Output

خب خیلی جاها من دیدم که گفتن نمیشه با ویژوال بیسیک ورودی خروجی هارو کنترل کرد. در صورتی که این حرف کاملآ اشتباه هست. ویژوال بیسیک قابلیت کنت...