بنام خدا
اولا بگم که من اطلاعاتم ناقص و پراکنده و شاید غلط باشد و چیزهایی که اینجا می نویسم برداشتهای من است و نمی توانم مدعی بشوم که همه درست است.
استفاده از توابع api
اون طور که من فهمیدم ویندوز خیلی از کارهای خودش را با استفاده از توابعی انجام می دهد که داخل یکسری فایل با پسوند dll است. گویا این فایلها در پوشه سیستم یا سیستم 32 پوشه ویندوز است. در ویندوز ایکس پی البته. در ویندوز 98 انگار فقط پوشه سیستم داشتیم. البته اگر درست یادم مونده باشه.
در بیشتر زبانها مثل ویژوال بیسیک - دلفی - سی شارپ - ویژوال سی و غیره می توانیم از این توابع api استفاده کنیم.
البته طرز استفاده در زبانهای مختلف کمی فرق دارد ولی کلیت کار همان است.
حالا در vb من چیزهایی که فهمیدم را شرح می دهم.
استفاده از توابع api در ویژوال بیسیک
ابتدا در بالای برنامه مثلا می نویسیم:
کد:
[COLOR="Red"]Private Declare[/COLOR] Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
قسمت Private Declare را همیشه من همین طور دیدم. حالا چرا باید خصوصی باشد را من نمی دانم.
اینجا داریم تابعی را دیکلر می کنیم. فکر کنم دیکلر یعنی معرفی. مثل معرفی یک مهمان جدید به بقیه حضار.
بعدش کلمه Function آمده که یعنی تابع می خواهیم معرفی کنیم.
بعدش نام تابع آمده. که در تک خط کد بالا نام تابع FindWindow است. یک نام دیگر بعد کلمه Alias آمده که FindWindowA است. حالا این دو نام چیست و چه ارتباطی با هم دارد را من نمی دانم.
ولی داخل برنامه می بینید که FindWindow به کار رفته نه FindWindowA . فرض من اینه که اولی اسم مستعار تابع شاید باشد و دومی نام اصلی تابع که در ویندوز مشهوره. ولی ممکنه این برداشت من غلط باشد. خودتان بعدا این قضیه را تحقیق کنید.
بعد نام تابع عبارت:
Lib "user32.dll"
را داریم. که معنایش احتمالا این است که این فایل در یک dll به نام user32.dll است. فکر کنم در استفاده از dll هایی که خودمان می نویسیم هم کلمه lib می آید. پس من این طور برداشت می کنم که هر وقت بخواهیم تابعی را از درون یک dll صدا بزنیم باید کلمه lib بیاید. احتمالا lib مخفف لایبرری است که به معنای کتابخانه است و منظور از کتابخانه در اینجا ((توابع داخل فایل dll )) است.
بعد می رسیم به قسمت ورودی و خروجی تابع:
کد:
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" [COLOR="Red"](ByVal lpClassName As String, ByVal lpWindowName As String)[/COLOR][COLOR="Blue"] As Long[/COLOR]
قسمت قرمز ورودی های تابع و قسمت آبی خروجی تابع است.
ورودی های این تابع دو تاست و هر دو از نوع string است.
خروجی تابع هم از نوع long است.
نامهای ورودی های تابع هم کمی راهنمایی کننده است.
برنامه نویسی ویندوز
در ویندوز آن طور که من فهمیدم هر برنامه که اجرا میشه یک کد خاص بهش داده میشه. یک عدد است. مثل شماره پلاک خودروهایی که در شهر تردد می کنند. یعنی هر خودرو به محض ورود به شهر یک عدد بهش داده میشه که صاحب شخصیت بشه.
تمرین:
ابتدا این خط کد را بالای برنامه اضافه کنید:
کد:
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
و سپس دکمه ای روی فرم قرار دهید و کدهای مربوط به آن را قرار دهید. مجموعه کد میشه این:
کد:
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
[COLOR="Blue"]Dim a As Long
a = FindWindow("Notepad", vbNullString)
Print a[/COLOR]
End Sub
برنامه را اجرا کنید.
اگر نت پد را باز نکرده باشد برنامه صفر چاپ می کند و اگر باز کرده باشد عددی چند رقمی چاپ می شود.
چند بار همان طور که برنامه ساخته شده شما در حال اجرا است نت پد را باز کنید و ببندید. در مواقع باز بودن نت پد ارقامی را دریافت می کنید. و بعد باز و بسته کردن نت پد رقم تغییر می کند. و اگر نت پد جدیدی هم علاوه بر قبلی که باز است باز کنید رقم جدیدی برنامه چاپ می کند.
برداشت من اینه که تابع FindWindow کلاس می خواهد به عنوان ورودی و من کلمه Notepad را به عنوان نام کلاس دادم.
حالا این کلمه را از کجا آوردم؟
یک برنامه که به زبان دلفی هست من دارم که وقتی ماوس را روی پنجره ای نگه دارید نام کلاس را به من می دهد. برای شما exe اش را آپلود می کنم.
http://www.divshare.com/download/3159610-de2
حالا دست بکار شوید.
کلاس را دارید و باید برای یاهو مسنجر(اگر درست فهمیده باشم) کد بنویسید.
در مورد تابع FindWindowEx هم برداشت من فعلا اینه که اجزای هر پنجره را شناسایی می کند. یعنی مثلا اتومبیل یک پلاک دارد ولی بدنه یا شاسی هم شماره مخصوص به خود دارد. البته در ویندوز فکر کنم بدنه و شاسی شماره متغیر دارد مثل متغیر بودن پلاک ماشینها(پنجره های ویندوزی).
بعد ساختن این قسمت توسط شما می رسیم به اینکه چطور پنجره ها در ویندوز با این کد منحصر به فرد می توانند با هم گفتگو کنند. مثلا با استفاده از تابع SendMessage .