|
|
#1 |
|
|
با سلام خدمت همه دوستان عزیزم. با توجه به اینکه خیلی از برنامه نویسهای vb آشنایی چندان زیادی با توابع API و قدرت آن ندارند قصد دارم اطلاعات مختصری که در این زمینه دارم رو با دوستان خوبم در سایت کینگ این ست تقسیم کنم . در ضمن من تا به حال تو اینترنت یه آموزش کامل و جامع در مورد توابع API ندیدم و این اولین آموزش کامل در مورد توابع API در اینترنت میباشد که منحصرا برای سایت کینگ این ست ( Kingin3at ) میباشد .
دوستان خوبم در صورت هر گونه کم و کاستی در آموزش پیشاپیش عذر خواهی میکنم . قسمت اول : رابط برنامه نویسی کاربردی ( API ) API مخفف عبارت Application Programming Interface ( رابط برنامه نویسی کاربردی ) میباشد . سیستم عامل ویندوز توابع و ساختارهایی را در اختیار برنامه نویسان قرار میدهد . این توابع و ساختارها جزیی از خود ویندوز میباشند که هم در ساخت خود ویندوز و هم در برنامه های تحت ویندوز استفاده شده اند . آنها در فایلهای DLL ( Dynamic Link Library ) متعددی قرار دارند و فلسفه استفاده از آنها بدین شکل است که در برنامه های کاربردی در صورت نیاز به استفاده از این توابع آنها را از درون فایل DLL صدا زده و پس از آن کنترل به برنامه کاربردی باز میگردد . این توابع به شکلی طراحی شده اند که چندین برنامه می توانند بصورت همزمان از یک تابع استفاده کنند . فایلهای کتابخانه ای که در ویندوز 3.x حاوی توابع API بودند ، عبارتند از Kernel.dll و User.dll و Gdi.dll که Kernel.dll حاوی توابعی در رابطه با هسته سیستم عامل و مدیریت حافظه و منابع سیستم بود . فایل User.dll توابع کاربردی در رابطه با انواع داده و ... را درون خود داشت و فایل Gdi.dll حاوی توابعی در رابطه با ظاهر برنامه های تحت ویندوز بود . معادل این فایلها در ویندوزهای 32 بیتی عبارتند از Kernel32.dll ، User32.dll و Gdi32.dll و همچنین فایلهای AdvApi.dll که حاوی توابع توسعه یافته ای برای ویندوز و فایل mmsystem.dll که حاوی توابع چند رسانه ای ویندوز میباشند به ویندوز های 32 بیتی اضافه شده اند . از آنجا که زبان ویژوال بیسیک بر اساس زبان بیسیک طراحی شده است ، سعی برآن بوده که سادگی آن حفظ شود . از طرفی برای برطرف کردن نیازهای برنامه نویسان حرفه ای امکاناتی جهت استفاده از سرویسهای ویندوز در آن تعبیه گردیده است . با شناخت این توابع و طرز استفاده از آنها هر جا که توابع ویژوال بیسیک نتوانستند جوابگوی نیاز ما باشند ، میتوان از این توابع استفاده کرد . از آنجا که ویندوز بر پایه همین توابع پیاده سازی شده است ، محدودیتهای زبان برنامه نویسی ویژوال بیسیک شکسته خواهد شد . حال به بررسی نحوه استفاده از توابع API میپردازیم . در ویژوال بیسیک توابع API مورد نیاز را باید قبل از استفاده معرفی کنیم ، یعنی در برنامه حالت کلی یا تعریف ( Declare ) تابع را به برنامه اضافه کنیم . از آنجا که دو نمونه ، زیر برنامه وجود دارد ( Sub و Function ) دو نوع حالت کلی نیز برای توابعAPI میتوان در نظر گرفت : حالت اول : [Public | Private ] Declare Function FuncName Lib "LibName" [Alias "Func"] ([ArgList]) As ReturnType کلمه Declare نشاندهنده آن است که خط مورد نظر تعریف یک تابع میباشد . البته بسته به محل تعریف آن قبل از کلمه Declare عبارت Public یا Private قرار میگیرد . عبارت Function مشخص کننده این است که به صورت تابع با مقدار برگشتی از آن استفاده خواهد شد . FuncName نام تابعی است که میخواهیم از آن استفاده کنیم . Lib "LibName" نشاندهنده فایل کتابخانه ای ( DLL ) است که تابع مورد نظر در آن قرار دارد . Alias "Func" به وسیله این عبارت میتوان نامی مستعار برای تابع در نظر گرفت ArgList پارامترهای ورودی تابع میباشند که به وسیله کاما از یکدیگر جدا میشوند . یک تابع ممکن است هیچ پارامتری نداشته باشد بنابراین جلوی تابع پرانتزهای خالی قرار میگیرد ReturnType مشخص کننده نوع مقدار برگشتی تابع است حالت دوم : [Public|Private] Declare Sub SubName Lib "LibName" [Alias "Sub"] تعداد API هایی که بطور استاندارد همراه ویندوز هستند آنقدر زیاد است که نمیتوانید نام و حالت کلی آنها را به یاد داشته باشید . پس برای استفاده از API باید چه کرد ؟ میکروسافت برای اینکار ابزاری را به نام API Text Viewer به همراه ویژوال بیسیک عرضه کرده است . با استفاده از این ابزار میتوان حالت کلی توابع API را به برنامه اضافه کرد . علاوه بر حالت کلی توابع ، انواع ساختارهای مورد استفاده API های ویندوز و ثابتهای تعریف شده برای این توابع نیز در API Text Viewer قرار دارند . نرم افزار API Text Viewer به صورت مجزا از طریق منوی Start ( شاخه ای که ویژوال بیسیک در آن قرار دارد ) قابل اجرا و از طریق منوی Add-In در محیط ویژوال بیسیک نیز قابل استفاده می باشد . در استفاده از توابع API باید نکاتی را در نظر گرفت . همیشه قبل از اجرای برنامه فایلهای پروژه را ذخیره کنید زیرا هنگامی که از توابع API استفاده میکنید در حقیقت از هسته سیستم عامل استفاده کرده اید و در صورت هر گونه اشتباه در ارسال پارامترهای تابع ممکن است سیستم عامل برنامه ایجاد کننده خطا را ( که ویژوال بیسیک است ) از حافظه خارج کند . از آنجا که توابع API را به زبان c++ نوشته اند ، باید به ارسال پارامترها به توابع دقت کرد . پیش فرض نوع ارسال پارامترها در c++ ارسال با مقدار By Value است ، مگر اینکه پارامتر از نوع اشاره گر باشد . در ویژوال بیسیک پیش فرض ارسال پارامترها ارسال با مرجع ( By Reference ) می باشد . بنابراین باید در ارسال پارامترها دقت کافی داشت تا در صورت نیاز عبارت ByVal را قبل از آن ذکر کرد . برای ارسال آرایه ها به توابع API باید ادرس اولین عنصر آرایه را ارسال کنیم . رشته ها در c++ به صورت ASCIIZ ( رشته های منتهی به کاراکتر اسکی صفر ) می باشند بنابراین برای جلوگیری از بروز اشتباه در ارسال پارامترهای رشته ای به توابع API باید ابتدا کاراکتر اسکی صفر را در تمام خانه های یک رشته با طول مشخص قرار داد . این عمل به سه روش زیر انجام میگیرد : 1 Dim StrDriveName As String StrDriveName = Space (255) 2 Dim StrDriveName As String StrDriveName = String(255,0) 3 Dim StrDriveName As String * 255 بعضی از توابع API پارامترهایی از نوع Any دارند . پارامترهایی که از نوع Any تعریف شده باشند هر نوع داده ای را قبول میکنند و در زمان ارسال پارامتر ها ویژوال بیسیک صحت نوع داده را بررسی نمیکند و این میتواند مشکلاتی ر ا برای برنامه نویس تولید کند . بنابراین بهتر است بسته به نحوه صدا زدن تابع ، نوع پارامتر های آن را بطور صریح اعلام کنیم . کنترل ها را نمی توان به عنوان پارامتر به توابع API ارسال کرد ، ولی از آنجا که خواص کنترلها ، رفتاری مانند متغیرهای معمولی دارند ، میتوان آنها را به عنوان پارامترهای ورودی به توابع ارسال کرد . پارامترهای بعضی از توابع API از نوع اشاره گر رشته ای تعیین شده اند . این مسئله تا زمانی که بخواهیم مقدار NULL را به تابع ارسال کنیم مشکلی را ایجاد نمیکند . برای این منظور از ثابت vbNullString استفاده میکنیم . جدا سازی مقادیر با ارزش / کم ارزش از یک مقدار Long : بعضی از توابع API مانند SendMessage یا PostMessage ( بعدا با این توابع آشنا میشوید ) برای پارامترهای خود احتیاج به عددی از نوع Long دارند که از دو قسمت با ارزش و کم ارزش تشکیل شده و برای تعیین این مقدار باید هر دو قسمت با ارزش و کم ارزش را ترکیب کرد . روشی که برای ترکیب این دو مقدار به کار میبریم ، شیفت دادن ( Shift ) است . اما ویژوال بیسیک عملگر شیفت ندارد و ما مجبوریم با استفاده از عمل ضرب این کار را انجام دهیم . برای اینکه یک عدد از نوع Integer را به مقدار Long تبدیل کنیم باید آن را در عدد &H10000 ( برابر 65536 دسیمال ) ضرب کرد . تاثیر این ضرب همانند عمل شیفت 16 بیتی به چپ است و مکانی را برای عدد کم ارزش فراهم می سازد . قبل از اینکه مقدار کم ارزش را با مقدار شیفت داده شده جمع کنیم ، باید آن را اصلاح کرد . حتما میدانید که نوع Integer در ویژوال بیسیک دارای علامت است ، اما مقدار کم ارزش ، باید بدون علامت باشد . بر ای اینکه بتوان یک عدد از نوع Integer را به عددی بدون علامت تبدیل کرد باید عدد مورد نظر را با عدد &HFFFF& ( علامت & آخر را فراموش نکنید ) AND کرد . با این عمل بیت علامت پاک می شود ولی مقدار عددی آن باقی میماند . برای این منظور دو تابع آماده شده که اولی دو عدد صحیح Integer را از ورودی گرفته و با همدیگر ترکیب میکند و حاصل را به شکل یک عدد Long بر میگرداند و دومی یک عدد از نوع Long را گرفته و دو عدد از نوع Integer را بر میگرداند . تابع ترکیب دو عدد صحیح : Function MakeDWord ( LoWord As Integer , HiWord As Integer ) As Long MakeDWord = (HiWord * &H10000 ) or ( LoWord And &HFFFF& ) End Function توابع جداسازی دو قسمت با ارزش و کم ارزش : Function HiWord (DWord As Long) As Integer HiWord = (DWord And &HFFFF0000) \ &H10000 End Function Function LoWord (DWord As Long) As Integer If DWord And &H8000& Then LoWord = DWord Or &HFFFF0000 Else LoWord = DWord And &HFFFF& End If End Function تابع HiWord مقدار Long را با استفاده از تقسیم بر &H10000 به شکل 16 بیتی شیفت می دهد و تابع LoWord مقدار کم ارزش را با عملگر And بست می آورد . برای آنکه علامت عدد را برگردانیم آن را با عدد &HFFFF0000 ، Or میکنیم . قسمت اول به پایان رسید . اگه مطالب یه کم گنگ به نظر میرسید نگران نباشید . در قسمتهای بعدی که با توابع API کار کنیم میبینید که این توابع چقدر ساده هستند . سعی میکنم هر روز یک قسمت رو آماده کنم و تو سایت بزارم . |
|
|
|
|
|
#2 |
|
|
قسمت دوم آموزش کار با توابع API :
با سلام خدمت دوستان عزیزم . امیدوارم قبل از مطالعه این قسمت ، قسمت قبل را مطالعه کرده باشید . از این قسمت به بعد به معرفی توابع API و نحوه استفاده از آنها میپردازیم . قبل از اینکه به معرفی اولین تابع بپردازیم نحوه استفاده از این توابع در محیط ویژوال بیسیک را میگوییم . در محیط ویژوال بیسیک به منوی Add-In رفته و گزینه Add-In Manager را انتخاب کرده و ار صفحه باز شده گزینه VB6 API Viewer را انتخاب کرده و تیک گزینه Loaded/Unloaded و Load On Startup را بزنید . و سپس از منوی Add-In گزینه API Viewer را انتخاب کنید . از برنامه باز شده به منوی File رفته و گزینه Load Text File را انتخاب کنید و از پنجره باز شده فایل WIN32API.TXT را انتخاب کنید . حالت کلی توابع API در این فایل ذخیره شده اند . از این به بعد هر تابعی را که معرفی میکنیم و شما قصد استفاده از آن را دارید به این صورت به برنامه خود اضافه میکنید . فقط یادتان باشد در برنامه API Viewer گزینه Private را انتخاب کرده باشید . برای انتقال تابع مورد نظرتان فقط کافیست که روی تابع مورد نظر دوبار کلیک کنید و کد آن را که در قسمت پایین پنجره برنامه API Viewer است کپی کرده و در برنامه خودتان در محیط ویژوال بیسیک پیست ( Paste ) کنید . خب بریم سراغ اولین تابع . تابع AnimateWindow : این تابع جلوه های ویژه روی فرم ایجاد میکند . به طور مثال فرم برنامه شما از مرکز شروع به باز شدن میکند و یا ... . حالت کلی این تابع به صورت زیر است : Private Declare Function AnimateWindow Lib "user32" (ByVal hwnd As Long, ByVal dwTime As Long, ByVal dwFlags As Long) As Boolean نکته : اگر این تابع در برنامه API Viewer شما موجود نبود شکل کلی تابع را از اینجا کپی کنید و در محیط ویژوال بیسیک خودتان پیست کنید . نکته : هر برنامه ای که در ویژوال بیسیک نوشته میشود از 1 تا چند شئی ممکن است داشته باشد . هر کدام از این شئی ها با یک مشخصه از هم جدا میشوند به این مشخصه hwnd یا دستگیره میگویند . با hwnd شما میتوانید یک شئی را از شئی دیگر تشخیص دهید . برگردیم سراغ تابع AnimateWindow ، پارامترهای ورودی این تابع عبارتند از : پارامتر اول ، hwnd ( دستگیره ) پنجره ای ( فرمی ) که میخواهیم جلوه تصویری روی آن اعمال شود . پارامتر دوم ، dwTime مدت زمان نمایش جلوه تصویری روی پنجره را تعیین میکند ( بر حسب میلی ثانیه ) پارامتر سوم ، dwFlags نوع جلوه تصویری و زمان نمایش آن را تعیین میکند . منظور از زمان نمایش اینست که جلوه تصویری در ابتدای اجرای برنامه اجرا شود یا در انتهای آن .انواع جلوه های تصویری روی فرم به صورت زیر هستند . توضیحات ثابت پنجره را با حالت اسلاید نمایش میدهد AW_SLIDE جلوه تصویری را به هنگام فعال شدن پنجره نمایش میدهد AW_ACTIVATE پنجره را با حالت ظاهر یا محو شدن تدریجی نمایش میدهد AW_BLEND جلوه تصویری را به هنگام مخفی شدن پنجره نمایش میدهد AW_HIDE اگر از AW_HIDE استفاده شده باشد ، پنجره را با حرکت به سمت داخل و مرکز آن فرو می ریزد و در غیر اینصورت پنجره را با حرکت به سمت بیرون از مرکز آن باز میکند . AW_CENTER جلوه تصویری از سمت چپ به راست نمایش داده میشود AW_HOR_POSITIVE جلوه تصویری از سمت راست به چپ نمایش داده میشود AW_HOR_NEGATIVE جلوه تصویری از بالا به پایین نمایش داده میشود AW_VER_POSITIVE جلوه تصویری از پایین به بالا نمایش داده میشود AW_VER_NEGATIVE حالا چطور باید از این ثابتها استفاده کنید ؟ بعد از اینکه تابع مورد نظرتان را در پنجره کد نویسی در بالاترین قسمت آن نوشتید ( کپی کردید ) این ثابتها را به صورت زیر در زیر آن تعریف و مقدار دهی میکنید . Const AW_HOR_POSITIVE = &H1 Const AW_HOR_NEGATIVE = &H2 Const AW_VER_POSITIVE = &H4 Const AW_VER_NEGATIVE = &H8 Const AW_CENTER = &H10 Const AW_HIDE = &H10000 Const AW_ACTIVATE = &H20000 Const AW_SLIDE = &H40000 Const AW_BLEND = &H80000 در رابطه با استفاده از ثابتهای این تابع باید نکاتی را در نظر گرفت که به صورت زیر هستند . AW_SLIDE را نباید همزمان با AW_CENTER استفاده کرد . AW_ACTIVATE را نباید همزمان با AW_HIDE استفاده کرد . AW_BLEND فقط برای پنجره هایی به کار میرود که بالاترین رتبه را دارند . ثابتهای AW_HOR_POSITIVE و AW_HOR_NEGATIVEو AW_VER_POSITIVEو AW_VER_NEGATIVE را نمی توان همزمان با AW_BLEND و AW_CENTER بکار برد . نباید این تابع را بر روی فرمهایی که در آنها از Region استفاده شده است ، بکار برد . حالا با یک مثال کار این تابع را میبینیم . یک پروژه جدید باز کنید و دو کلید ( CommandButton ) روی آن قرار دهید و کدهای زیر را وارد کنید . Private Declare Function AnimateWindow Lib "user32" (ByVal hwnd As Long, ByVal dwTime As Long, ByVal dwFlags As Long) As Boolean Const AW_HOR_POSITIVE = &H1 Const AW_HOR_NEGATIVE = &H2 Const AW_VER_POSITIVE = &H4 Const AW_VER_NEGATIVE = &H8 Const AW_CENTER = &H10 Const AW_HIDE = &H10000 Const AW_ACTIVATE = &H20000 Const AW_SLIDE = &H40000 Const AW_BLEND = &H80000 Private Sub Command1_Click() AnimateWindow Command2.hwnd, 3000, AW_CENTER + AW_HIDE End Sub Private Sub Form_Load() AnimateWindow Me.hwnd, 3000, AW_BLEND Me.Cls End Sub برنامه را اجرا کرده و روی کلید Command1 کلیک کرده و نتیجه را ببینید . نکته : منظور از شئی Me در کدهای بالا ، فرم در حال اجرای برنامه است . یعنی فرمی که در حال حاضر فوکوس برنامه روی آن است . تابع بعدی تابع FlashWindow می باشد . این تابع پنجره برنامه را به صورت چشمک زن در می آورد . کاربد این تابع برای جلب توجه کاربر است . حالت کلی این تابع به صورت زیر است . Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long این تابع دو پارامتر دارد . hwnd : دستگیره پنجره ای است که می خواهیم چشمک زن شود . پارامتر bInvert دو مقدار True یا False را میپذیرد . True یعنی یک بار چشمک زدن و False یعنی برگشتن به حالت ابتدایی . حال با مثال کار تابع را میبینیم . ابتدا یک پروژه جدید بسازید و دو کلید ( CommandButton ) و یک کنترل Timer به فرم اضافه کنید و کدهای زیر را وارد کنید . نکته : خاصیت Interval مربوط به شئی Timer را برابر با 500 قرار دهید . Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long Private Sub Command1_Click() Timer1.Enabled = True FlashWindow Me.hwnd, True End Sub Private Sub Command2_Click() Timer1.Enabled = False FlashWindow Me.hwnd, False End Sub Private Sub Timer1_Timer() FlashWindow Me.hwnd, True End Sub حالا برنامه را اجرا کنید و نتیجه را ببینید . فک میکنم اونقدر ساده باشه که نیازی به توضیح اضافی هم نداره . تابع بعدی تابع SetWindowPos می باشد . با استفاده از این تابع می تونیم محل قرار گرفتن پنجره در چهارچوب مانیتور رو مشخص کنیم و همچنین لایه بندی پنجره در بین پنجره ها . با این تابع ما فرم برنامه خودمون رو ، روی همه برنامه ها قرار می دهیم . حالت کلی این تابع به صورت زیر است . Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long پارامترها : hwnd : دستگیره پنجره ای ( فرمی ) که می خواهیم همیشه رو قرار گیرد . نکته : zorder چیست ؟ یک لیست داخلی است که در آن ترتيب قرار گرفتن يک پنجره روي پنجره اي ديگر مشخص شده است . پارامتر hwndInsertAfter : دستگیره پنجره ای که در لیست zorder جلوتر قرار دارد . ( دستگیره پنجره والد یا مالک پنجره ای که میخواهیم همیشه رو قرار گیرد ) این پارامتر باید یک دستگیره پنجره و یا یکی از مقادیر زیر باشد . توضیحات ثابت پنجره را در پایین ترین حد zorder قرار می دهد . اگر پارامتر اول بالاترین پنجره را مشخص کند ، مکان خود را از دست میدهد و در پایین ترین مکان در میان دیگر پنجره ها قرار می گیرد . HWND_BOTTOM پنجره را در بالای همه پنجره های non_topmost قرار میدهد ( پشت پنجره های همیشه رو top_most قرار میگیرد ) . این ثابت تاثیری بر پنجره ای که دارای خاصیت non_topmost است ندارد. HWND_NOTOPMOST پنجره را در بالاترین حد zorder قرار میدهد . HWND_TOP پنجره را در بالای همه پنجره های non_topmost قرار می دهد . وقتی پنجره غیر فعال شود ( پنجره دیگری فعال شود ) این پنجره مکان همیشه رو خود را حفظ می کند . HWND_TOPMOST نحوه تعریف ثابتها به صورت زیر است . Const HWND_BOTTOM = 1 Const HWND_NOTOPMOST = -2 Const HWND_TOP = 0 Const HWND_TOPMOST = -1 من در اینجا پر کاربرد ترین ثابتها را ذکر کردم . برای اطلاع از تمام ثابتهای این تابع به برنامه API Viewer رفته از منوی کشویی API Type گزینه Constants را انتخاب کرده و در کادر Type the first few lettersof the word you are looking for : عبارت hwnd را تایپ کنید . هر عبارتی که با hwnd آغاز شده بود مربوط به این تابع می باشد . پارامتر X : مکان جدید سمت چپ پنجره را مشخص می کند . ( Left ) پارامترY : مکان جدید بالای پنجره را مشخص می کند . ( Top ) پارامتر Cx : اندازه پهنای جدید پنجره را مشخص می کند . ( Width ) پارامترCy : اندازه ارتفاع جدید پنجره را مشخص می کند . ( Heihgt ) پارامتر wFlags : علامت مربوط به تغییر اندازه و مکان را مشخص می کند . این پارامتر را میتوان به صورت ترکیبی از ثابتهای زیر نیز به کار برد . توضیح ثابت یک قاب به دور پنجره رسم میکند . SWP_DRAWFRAME یک style جدید برای قاب پنجره با استفاده از تابع SetWindowLong تعیین میکند . SWP_FRAMECHANGED پنجره را مخفی میکند . SWP_HIDEWINDOW محل فعلی پنجره را نگه می دارد . پارامترهای x و y تابع استفاده نمی شوند SWP_NOMOVE محل پنجره مالک ( owner window ) را در zorder تغییر نمی دهد SWP_NOOWNERZORDER ,SWP_NOREPOSITION اگر این ثابت استفاده شود رویداد repaint رخ نمی دهد SWP_NOREDRAW از رسیدن پیغام WM_WINDOWPOSCHANGING به پنجره جلوگیری میکند . SWP_NOSENDCHANGING اندازه پنجره را حفظ میکند . پارامتر cx و cy در تابع استفاده نمی شوند SWP_NOSIZE مقدار zorder فعلی را حفظ میکند . پارامتر hwndInsertAfter تابع استفاده نمی شود . SWP_NOZORDER پنجره را نمایش می دهد . SWP_SHOWWINDOW نکته : در صورتی که از SWP_SHOWWINDOW یا SWP_HIDEWINDOW استفاده شود ، پنجره تغییر مکان یا اندازه نمی دهد . نحوه تعریف این ثابتها به صورت زیر است . Const SWP_HIDEWINDOW = &H80 SWP_FRAMECHANGED = &H20 Const Const SWP_DRAWFRAME = &H20 Const SWP_NOMOVE = &H2 Const SWP_SHOWWINDOW = &H40 Const SWP_NOREDRAW = &H8 Const SWP_NOSIZE = &H1 Const SWP_NOZORDER = &H4 Const SWP_NOOWNERZORDER = &H200 SWP_NOREPOSITION = &H200 Const من در اینجا پر کاربرد ترین ثابتها را ذکر کردم . برای اطلاع از تمام ثابتهای این تابع به برنامه API Viewer رفته از منوی کشویی API Type گزینه Constants را انتخاب کرده و در کادر Type the first few lettersof the word you are looking for : عبارت swp را تایپ کنید . هر عبارتی که با swp آغاز شده بود مربوط به این تابع می باشد . حالا با یک مثال که در آن قصد دارم فرم برنامه خودمان را Always On Top قرار دهم با نحوه استفاده از این تابع آشنا میشویم . ابتدا یک پروژه جدید ایجاد کنید و دو کلید ( CommandButton ) روی آن قرار دهید و کدهای زیر را وارد کنید . Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Const SWP_NOMOVE = &H2 Const SWP_NOSIZE = &H1 Const HWND_BOTTOM = 1 Const HWND_NOTOPMOST = -2 Const HWND_TOP = 0 Const HWND_TOPMOST = -1 Private Sub Command1_Click() SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End Sub Private Sub Command2_Click() SetWindowPos Me.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End Sub حالا برنامه را اجرا کرده و در کنار اجرای برنامه یک برنامه دیگر هم اجرا کنید و بعد کلید Command1 را کلیک کنید . حالا برنامه شما همیشه رو قرار دارد و برنامه های دیگر زیر آن قرار میگیرند ( امتحان کنید ) . با زدن کلید command2 برنامه شما این خاصیت را از دست میدهد . تنها توضیح در مورد این برنامه این است که پارامترهای سوم ، چهارم ، پنجم و ششم که برای تغییر اندازه و مکان به کار می روند با صفر مقدار دهی شده اند تا در اندازه و مکان فرم برنامه تغییری ایجاد نشود . شما میتوانید این اعداد را تغییر دهید تا نتیجه کار را خودتان ببینید . ( حتما امتحان کنید ) . تابع بعدی باز هم تابع SetWindowPos است . البته تو این مثال یه کار جالبتر رو یاد میگیریم . البته قبل از اینکه بریم سراغ مثال ، با یک تابع دیگر آشنا میشویم . تابع FindWindow : این تابع hwnd ( دستگیره ) یک پنجره خاص رو برای ما به دست میاره . در مورد این تابع سر جای خودش همه مطالب رو میگم ولی فعلا همینقدر بدونید که hwnd یک پنجره رو برای ما بدست میاره . در این مثال قصد داریم نوار Taskbar ویندوز را مخفی کنیم . پس اول نیاز داریم که hwnd نوار Taskbar رو بدست بیاوریم و سپس با تابع SetWindowPos آن را محو کنیم . ابتدا یک پروژه جدید ایجاد کنید و دو کلید روی آن قرار دهید و کدهای زیر را وارد کنید . Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Hwnd1 As Long Const SWP_HIDEWINDOW = &H80 Const SWP_SHOWWINDOW = &H40 Private Sub Command1_Click() Hwnd1 = FindWindow("Shell_Traywnd","") SetWindowPos Hwnd1, 0, 0, 0, 0, 0, SWP_HIDEWINDOW End Sub Private Sub Command2_Click() SetWindowPos Hwnd1, 0, 0, 0, 0, 0, SWP_SHOWWINDOW End Sub حالا برنامه را اجرا کنید و کلید command1 را کلیک کنید . برای ظاهر شدن Taskbar کلید Command2 را کلیک کنید . قسمت دوم هم اینجا به پایان رسید . در قسمت بعدی با توابع بیشتری آشنا می شوید و میبینید که چه کارهای جالبی با این توابع می توان کرد . فایل تایپ شده این آموزش رو هم در قسمت ضمیمه میگذارم که میتونید دانلود کنید . |
|
|
|
|
|
#3 |
|
|
خدمت دوستای خوبم سلام عرض میکنم . متاسفانه به خاطر یه مشکل کاری نمیتونم مدت 1 هفته به سایت سر بزنم و انشاالله بعد از این 1 هفته قسمت سوم آموزش رو میزارم . باز هم به خاطر این تاخیر معذرت میخوام
|
|
|
|
|
|
#4 |
|
|
با عرض سلام خدمت همه دوستان خوبم و عذر خواهی بابت تاخیری که در آموزش افتاد .
بریم سراغ قسمت سوم آموزش . زمانیکه توسط ویندوز فایلی را کپی میکنید ، پنجره ای باز میشود و در آن انمیشن مربوط به کپی کردن فایل را میبینید ما میخواهیم در برنامه خودمان از این امکانات ویندوز در این خصوص استفاده کنیم . ما میخواهیم کلیه عملیات روی فایل ( کپی ، جابجایی ، تغییر نام و پاک کردن ) را توسط امکانات ویندوز انجام دهیم . برای اینکار از تابعی به نام SHFileOperation استفاده کنیم . حالت کلی این تابع به صورت زیر است : Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long پارامترهای این تابع : lpFileOp : آدرس ساختار SHFILEOPSTRUCT است و حاوی اطلاعاتی است که برای این تابع مورد نیاز است . عضوهای ساختار SHFILEOPSTRUCT نباید با Null مقدار دهی شوند . از صحت داده هایی که برای این تابع ارسال میکنید کاملا مطمئن باشید در غیر اینصورت نتیجه ای غیر منتظره میگیرید . برای استفاده از این تابع باید ساختار مربوط به آن یعنی SHFILEOPSTRUCT را خوب بشناسیم . مشخصات این ساختار به صورت زیر است : Private Type SHFILEOPSTRUCT hwnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As Long hNameMappings As Long lpszProgressTitle As String End Type عضوهای ساختار : Hwnd : دستگیره پنجره ای که این تابع را صدا زده است . wFunc : این پارامتر تعیین میکند که تابع باید چه عملی را انجام دهد . این عضو از ساختار می تواند یکی از مقادیر زیر را به خود بگیرد . توضیح ثابت برای کپی کردن فایل از آدرس مشخص شده در pFrom به آدرس pTo FO_COPY فایل مشخص شده در pFrom را پاک میکند FO_DELETE جابجایی فایل مشخص شده در pFrom به آدرس مشخص شده در pTo FO_MOVE تغییر نام فایل مشخص شده در pFrom FO_RENAME مقدار این ثابتها به صورت زیر است : Private Const FO_COPY = &H2 Private Const FO_MOVE = &H1 Private Const FO_DELETE = &H3 Private Const FO_RENAME = &H4 نکته : از ثابت FO_RENAME نمیتوانید برای تغییر نام چند فایل ، با یک بار صدا زدن تابع استفاده کنید . pFrom : آدرس بافری که نام یک یا چند فایل مبدا در آن قرار گرفته است . این نام فایل باید به صورت کامل وارد شده باشد . از کاراکترهای نشانه ( "*") در مشخص کردن مسیر فایل نیز میتوان استفاده کرد . در صورتی که بخواهیم چندین نام فایل را در بافر مشخص کنیم باید در انتهای هر نام فایل یک کاراکتر Null قرار دهیم . ( جدا کننده در این رشته کاراکتر Null ، chr(0) است ) و در آخر این رشته نیز باید کاراکتر Null قرار بگیرد . pTo : آدرس بافری که نام فایل یا پوشه مقصد در آن قرار گرفته است . اگر از این پارامتر استفاده نمیکنید آن را با Null مقدار دهی کنید . برای مشخص کردن چند فایل ، این پارامتر شبیه به پارامتر pFrom مورد استفاده قرار میگیرد . اما نکاتی در رابطه با این پارامتر وجود دارد : 1 – در این پارامتر کاراکترهای نشانه قابل استفاده نیستند . 2 – در عمل کپی و یا جابجایی اگر در آدرس مشخص شده ، نام پوشه ای مشخص شده باشد که وجود ندارد ، ویندوز پیغامی را نمایش می دهد ، مبنی بر اینکه پوشه وجود ندارد و آیا این پوشه ساخته شود ؟ و نتیجه را کاربر مشخص میکند . اگر میخواهید این پیغام را دریافت نکنید و پوشه بطور مستقیم ساخته شود ، علامت FOF_NOCONFIRMMKDIR را در عضو fFlags بکار ببرید . 3- برای تغییر نام یا مکان فایلها ، بافر باید حاوی چند نام فایل در مقصد باشد و عضو fFlags باید حاوی ثابت FOF_MULTIDESTFILES باشد . 4- نام و مسیر فایل باید به صورت کامل وارد شده باشد . 5 – فایلی را که پاک کرده اید در صورتی که از ثابت FOF_NORECURSION استفاده نکرده باشید ، قابل برگشت است . fFlags : این عضو کنترل کننده عملگر فایل است . در این عضو می توانید از ترکیب ثابتها نیز استفاده کنید . مهمترین ثابتهای این عضو به صورت زیر هستند . توضیح ثایت اطلاعات مربوط به Undo را نگه میدارد . اگر عضو pFrom مسیر را بطور کامل مشخص نکرده باشد ، این ثابت در نظر گرفته نمی شود . FOF_ALLOWUNDO به این معنی است که در نام فایل مبدا اگر از کاراکتر نشانه *.* استفاده شده ، نام پوشه ها را در نظر نگیرد FOF_FILESONLY مشخص میکند که در pTo چند نام فایل مقصد وجود دارد . ( برای هر نام فایل مبدا یکی ) FOF_MULTIDESTFILES " Yes to all" را برای تمام پیغامهایی که نمایش داده می شوند ، در نظر می گیرد FOF_NOCONFIRMATION در حالتی که به پوشه ای اشاره شده باشد و آن پوشه وجود نداشته باشد ، ساخت پوشه جدید را قبول نمی کند . FOF_NOCONFIRMMKDIR اگر در مقصد ، فایلی همنام با نام فایل مورد نظر ( در اعمال کپی و یا تغییر مکان ) وجود داشته باشد ، نام جدیدی به آن اختصاص میدهد . ( این نام همان نام فایل قبل است که عبارت Copy of به ابتدای آن اضافه شده است ) FOF_RENAMEONCOLLISION پنجره جریان عمل فایل ( Progress Bar ) را نمایش نمیدهد FOF_SILENT پنجره جریان عمل فایل را بدون نام فایل نمایش میدهد . FOF_SIMPLEPROGRESS اگر از علامت FOF_RENAMEINCOLLISION در هنگام جابجایی فایل استفاده شود و نام جدیدی برای فایل مشخص شود ، یک کپی از نام قدیمی و جدید را در hNameMappings قرار می دهد . FOF_WANTMAPPINGHANDLE مقادیر این ثابتها به صورت زیر است : Private Const FOF_ALLOWUNDO = &H40 Private Const FOF_FILESONLY = &H80 Private Const FOF_NOCONFIRMATION = &H10 Private Const FOF_NOCONFIRMMKDIR = &H200 Private Const FOF_RENAMEONCOLLISION = &H8 Private Const FOF_SILENT = &H4 Private Const FOF_SIMPLEPROGRESS = &H100 Private Const FOF_WANTMAPPINGHANDLE = &H20 fAnyOperationsAborted : اگر کاربر عمل مربوط به فایل را قبل از اینکه بطور کامل انجام بگیرد قطع کند ( Abort ) مقدار True دریافت میشود و در غیر اینصورت False . hNameMappings : یک دستگیره به کپی نام قدیم و جدید فایلهای تغییر نام یافته . این عضو در صورتی قابل استفاده است که علامت fFlags دارای ثابت FOF_WANTMAPPINGHANDLE باشد . hNameMappings یک اشاره گر به ساختاری است که دارای دو عضو است : Private Type HANDLETOMAPPINGS uNumberOfMappings As Long lpSHNameMappins As SHNAMEMAPPING End Type Private Type SHNAMEMAPPING pszOldPath As String pszNewPath As String cchOldPath As Long cchNewPath As Long End Type عضو اول تعداد SHNAMEMAPPING را مشخص میکند که این ساختار مشخصات فایل قدیم و جدید را در خود دارد . فراموش نکنید که بعد از استفاده از این ساختار باید دستگیره آن را توسط تابع SHFreeNameMappings آزاد کنید . lpszProgressTitle : آدرس رشته ای است که عنوان پنجره نمایش جریان فایل را در خود دارد . این عضو تنها زمانی استفاده میشود که علامت fFlags دارای ثابت FOF_SIMPLEPROGRESS باشد . در صورتی که آدرس مبدا یا مقصد وارد نشده باشد ، آدرس مسیر جاری از درایو محلی جاری جای آن را میگیرد و اگر پارامتر pFrom با نام فایل مقدار دهی شده ، و فایل با استفاده از ثابت FO_DELETE پاک شود ، فایل مورد نظر به سطل آشغال تغییر مکان نمیدهد ، حتی اگر از ثابت FOF_ALLOWUNDO نیز استفاده شده باشد . با یک مثال نحوه پاک کردن یک فایل را بررسی میکنیم . یک پروژه جدید ایجاد کنید . اشیا زیر را به فرم اضافه کنید . CommandButton و DriveListBox و FileListBox و DirListBox . حالا کدهای زیر را وارد کنید . Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long Private Type SHFILEOPSTRUCT hwnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As Long hNameMappings As Long lpszProgressTitle As String End Type Private Const FOF_ALLOWUNDO = &H40 Private Const FO_DELETE = &H3 Private Sub Command1_Click() Dim typOperation As SHFILEOPSTRUCT With typOperation .hwnd = Me.hwnd .wFunc = FO_DELETE .pFrom = File1.Path + File1.FileName .fFlags = FOF_ALLOWUNDO End With a = SHFileOperation(typOperation) End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub قبل از اجرای برنامه دقت کنید که اگر حالت کلی تابع را خودتان از طریق برنامه API Viewe در برنامه خودتان کپی کرده اید یک فاصله اضافی در قسمت" Alias " SHFileOperationAاز کد برنامه وجود دارد که باید این فاصله را پاک کنید . اگر این فاصله را پاک نکنید برنامه با خطا مواجه می شود . اگر هم کد را از اینجا کپی کنید کد تصحیح شده است . این خطا از ویندوز است و کامپیوتر شما مشکلی ندارد . و اما تابع بعدی تابع GetShortPathName است . این تابع یک آدرس بلند را به آدرس کوتاه تبدیل میکند . یکی از موارد استفاده این تابع زمانی است که میخواهید یک آدرس را به یک شی یا تابع ارسال کنید ، اما اندازه رشته ای که برای این منظور در نظر گرفته شده کوچکتر از اندازه آدرس فایل است ( مثلا در توابع MCI که بعدا با آنها آشنا میشوید ، هنگامی که آدرس فایل را میخواهید مشخص کنید ، اگر نام فایل طولانی باشد ، خطای مربوط به پیدا نکردن فایل را دریافت خواهید کرد ) . این تابع در فایل Kernel32.dll قرار دارد . حالت کلی تابع به صورت زیر است : Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long و اما پارامتر های این تابع : lpszLongPath : حاوی رشته آدرس بلند ( اصلی ) فایل است . این رشته به Null ختم میشود . lpszShortPath : حاوی رشته آدرس کوتاه شده فایل است . cchBuffer : تعداد کاراکتر بافر مشخص شده در پارامتر lpszShortPath را مشخص میکند . این تعداد همان تعداد کاراکترهای برگشتی تابع است . برای تبدیل آدرس کوتاه به بلند تابع خاصی وجود ندارد و و شخصا باید این آدرس را تبدیل کنیم . برای این کار باید هر قسمت آدرس را به تنهایی تبدیل و در آخر همه آنها را به یکدیگر متصل کنیم . به مثال زیر دقت کنید : C:\Progra~1\Intern~1\Setup\ ابتدا آدرس پوشه Progra~1 ، سپس آدرس پوشه Intern~1 و در آخر باید آدرس Setup را تبدیل کرد . برای تبدیل این آدرس به آدرس بلند از تابع Dir در یک حلقه استفاده میکنیم . وقتی که تابع Dir را برای یافتن آدرس پوشه ای بکار میبریم ، آدرس برگشتی آدرس بلند خواهد بود . While iSlashPos sTemp = Dir(Left$(sShortName, iSlashPos - 1), vbNormal + vbHidden + vbSystem + vbDirectory) If sTemp = "" Then GetLongFileName = "" Exit Function End If sLongName = sLongName & "\" & sTemp iSlashPos = InStr(iSlashPos + 1, sShortName, "\") Wend حلقه ای که این وظیفه را بر عهده دارد ، در بالا آمده است ، در این حلقه ، ابتدا اولین علامت "\" ( البته به جز علامت "\" مربوط به نام درایو ) بدست می اید . سپس توسط تابع Dir به آدرس بلند تبدیل می شود و در صورتی که رشته ای برای تبدیل وجود نداشته باشد ، مقدار Null برگردانده می شود . بعد از یافتن اولین "\" و تبدیل آدرس به سراغ دومین "\" میرود و آن را به همان شکل تبدیل میکند و در نهایت اگر علامتی پیدا نشد حلقه به انتها رسیده است . در زیر مثال کاملی از موارد گفته شده را مشاهده میکنید . ابتدا یک پروژه جدید در ویژوال بیسیک ایجاد کنید . سپس کلیدهای ترکیبی Ctrl + T را فشار دهید . از کادر باز شده تیک گزینه Microsoft Common Dialog Control 6.0 را بزنید و کلید Ok را بزنید . حالا به پروژه دو کلید ( CommandButton ) و یک CommonDialog و دو TextBox اضافه کنید و کدهای زیر را وارد کنید . Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long Dim strpath As String Private Function GetShortName(ByVal sLongFileName As String) As String Dim sShortPathName As String * 255 Dim IRetVal As Long Dim iLen As Integer IRetVal = GetShortPathName(sLongFileName, sShortPathName, 255) GetShortName = Left(sShortPathName, IRetVal) End Function Private Function GetLongName(ByVal sShortName As String) As String Dim sLongName As String Dim sTemp As String Dim iSlashPos As Integer sShortName = sShortName & "\" iSlashPos = InStr(4, sShortName, "\") While iSlashPos sTemp = Dir(Left$(sShortName, iSlashPos - 1), vbNormal + vbHidden + vbSystem + vbDirectory) If sTemp = "" Then GetLongName = "" Exit Function End If sLongName = sLongName & "\" & sTemp iSlashPos = InStr(iSlashPos + 1, sShortName, "\") Wend GetLongName = Left$(sShortName, 2) & sLongName End Function Private Sub Command1_Click() CommonDialog1.ShowOpen strpath = GetShortName(CommonDialog1.FileName) Text1 = strpath End Sub Private Sub Command2_Click() Text2 = GetLongName(strpath) End Sub حالا برنامه را اجرا کرده و کلید اول را فشار دهید و از کادر باز شده یک فایل با یک آدرس طولانی را انتخاب کنید و سپس کلید دوم را فشار دهید . تابع بعدی تابع fCreateShellLink است . با این تابع میتوان یک فایل میانبر ( Shortcut ) ساخت . این تابع در فایل vb6stkit.dll قرار دارد . این فایل یک فایل کتابخانه ای ویژوال بیسیک است . حالت کلی این تابع به صورت زیر است : Private Declare Function fCreateShellLink Lib "vb6stkit.dll" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArguments As String, ByVal fPrivate As Long, ByVal sParent As String) As Long و اما پارامترهای این تابع : lpstrFolderName : مسیر فایل میانبر را مشخص میکند . شما میتوانید آدرس دلخواه خود را بدهید . اگر آدرسی مشخص نکنید ، فایل میانبر در بخش Program کلید Start ساخته میشود . lpstrLinkName : نام فایل میانبر را مشخص میکند . lpstrLinkPath : آدرس فایلی را که برای آن ، میانبر ساخته میشود مشخص میکند . lpstrLinkArguments : پارامتری که برای فایل میانبر باید فرستاده شود در این پارامتر قرار میگیرد . fPrivate : برابر با True قرار دهید . sParent : برابر با "$(Programs)" قرار دهید . حال با یک مثال با نحوه استفاده از این تابع آشنا میشوید . یک پروژه جدید بسازید و یک کلید روی آن قرار دهید و کد زیر را در آن وارد کنید . Private Declare Function fCreateShellLink Lib "vb6stkit.dll" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArguments As String, ByVal fPrivate As Long, ByVal sParent As String) As Long Private Sub Command1_Click() fCreateShellLink "..\..\Desktop", "King3at", "c:\windows\system32\calc.exe", "", True, "$(Programs)" End Sub در اینجا به پایان قسمت سوم میرسیم . تا قسمت بعد خوب تمرین کنید . فایل تایپ شده این آموزش رو هم ضمیمه میکنم |
|
|
|
|
|
#5 |
|
|
با سلام خدمت همه دوستان عزیزم .
قسمت چهارم از آموزش دستورات API را شروع میکنیم . برای اینکه بتوانیم اتصال اینترنت را قبل از اینکه به آن متصل شویم چک کنیم ، از تابع InternetCheckConnection از فایل wininetdd استفاده میکنیم . حالت کلی این تابع به صورت زیر است : Private Declare Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" (ByVal lpszUrl As String, ByVal dwFlags As Long, ByVal dwReserved As Long) As Long پارامترهای این تابع : lpszUrl : یک اشاره گر به رشته ای که حاوی آدرس Url است . این آدرس برای چک کردن اتصال استفاده میشود dwFlags : یک عدد صحیح مثبت که میتواند علامت زیر را در خود داشته باشد : FLAG_ICC_FORCE_CONNECTION اگر از این علامت استفاده شده باشد ، Socket اتصال ، یکی از موارد زیر را انجام می دهد : اگر پارامتر اول Null نباشد مقدار آدرس میزبان از آن بیرون کشیده می شود و برای ping کردن میزبان خاص استفاده میشود . اگر پارامتر اول Null باشد تلاشی برای لتصال به نزدیکترین سرویس دهنده بانک اطلاعاتی بین المللی WinInet صورت می گیرد و مقدار میزبان به دست آمده از آن برای ping کردن به سرویس دهنده مورد استفاده قرار میگیرد . dwReserved : رزرو شده ، صفر را برای آن ارسال کنید . با یک مثال بیشتر با نحوه استفاده از این تابع آشنا میشوید . ابتدا یک پروژه جدید باز کنید و یک کلید روی آن قرار دهید و سپس کد زیر را وارد کنید . Private Declare Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" (ByVal lpszUrl As String, ByVal dwFlags As Long, ByVal dwReserved As Long) As Long Private Const FLAG_ICC_FORCE_CONNECTION = &H1 Private Sub Command1_Click() If InternetCheckConnection("http://www.google.com", FLAG_ICC_FORCE_CONNECTION, 0) = 0 Then MsgBox "No Internet Connection Detected ...", vbInformation Else MsgBox "Internet Connection Detected !!!", vbInformation End If End Sub حالا برنامه را اجرا کرده و کلید را فشار دهید . اجرا کردن مرورگر پیش فرض سیستم توسط برنامه شما : برای اینکه بتوانید مرورگر پیش فرض سیستم را اجرا کنید ، ابتدا باید مرورگر اینترنت پیش فرض ثبت شده در سیستم را پیدا و سپس آن را اجرا کنید . برای پیدا کردن مرورگر پیش فرض ار تابعی به نام FindExecutable استفاده میکنیم . کار این تابع این است که یک فایل را تحویل میگیرد و با توجه به اطلاعات ثبت شده در رجیستری ، برنامه مرتبط با این نوع فایل را مشخص میکند . این تابع در فایل Shell32.dll قرار دارد . حالت کلی این تابع به صورت زیر است : Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long پارامترهای این تابع عبارتند از : lpFile : آدرس رشته ای که مشخص کننده نام فایل است . lpDirectory : آدرس رشته ای که مشخص کننده پوشه پیش فرض است . lpResult : آدرس بافری است که نام فایل را زمانی که تابع آن را بر میگرداند ، دریافت می کند . منظور از نام فایل ، نام برنامه ای است که فایل خاصی با آن مرتبط شده است و وقتی فایل مرتبط شده را باز میکنیم ، برنامه مربوطه اجرا شده و فایل قرار گرفته در پارامتر lpFile را مورد پردازش قرار میدهد . ایت پارامتر نباید مقدار Null داشته باشد ، تا بتواند نام برنامه مورد نظر را برای برنامه یرگرداند . ما برای انکه بتوانیم نام برنامه مرتبط با یک فایل را پیدا کنیم باید نام یک فایل را به این تابع تحویل دهیم و آن فایل باید حتما وجود داشته باشد . پس قبل از اینکه تابع را صدا بزنیم ، باید نام و مسیر فایل را داشته باشیم . در صورتی که فایلی را در نظر نداشته باشیم ، میتوانیم یک فایل ایجاد کنیم و در خاتمه کار آن را از بین ببریم . و در نهایت کار اجرای برنامه مورد نظر که در اینجا برنامه مرورگر مورد نظر است ، را توسط تابع ShellExecute انجام میدهیم . در مثال زیر کار با این توابع را یاد میگیرید : ابتدا یک پروژه جدید باز کنید و یک کلید روی آن قرار دهید و سپس کد زیر را وارد کنید : Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Const SW_SHOW = 5 Private Const SW_SHOWNORMAL = 1 Private Sub Command1_Click() Dim FileName As String, D As String Dim BrowserExec As String * 255 Dim RetVal As Long BrowserExec = Space(255) FileName = "C:\temp.HTML" Open FileName For Output As #1 Write #1, "ff" Close #1 RetVal = FindExecutable(FileName, D, BrowserExec) BrowserExec = Trim(BrowserExec) If RetVal <= 32 Or IsEmpty(BrowserExec) Then MsgBox "Could Not Find Associated Browser" Else RetVal = ShellExecute(Me.hwnd, "Open", BrowserExec, "www.a.kingin3at.info", D, SW_SHOWNORMAL) If RetVal <= 32 Then MsgBox " Web Page Not Opened" End If End If Kill FileName End Sub نکته : اگر مقدار برگشتی تابع ( Findexecutable ) بزرگتر از 32 باشد مشخص کننده موفقیت انجام کار تابع است و مقادیر کوچکتر و مساوی با 32 نشان دهنده رخ دادن خطا است . محدود کردن حرکت ماوس : در بعضی مواقع نیاز می شود که محدوده حرکت ماوس را به صورت دلخواه تعیین کنیم و اینکار توسط تابع ClipCursor انجام میشود . برای استفاده از این تابع باید از یک تابع دیگر نیز استفاده کنیم که این تابع ، GetWindowRect نام دارد . با استفاده از تابع GetWindowRect می توان مختصات یک پنجره را بدست آورد . منظور از پنجره در اینجا ، اشیایی است که دارای دستگیره ( Handel ) می باشند . به عنوان مپال علاوه بر فرم ها برای بدست آوردن مختصات جعبه متنها ، کلید ها ، جعبه لیست ها و ... می توان از این تابع استفاده کرد . مختصات بدست آمده بر حسب پیکسل می باشد . حالت کلی این تابع به صورت زیر است : Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Long, lpRect As RECT) As Long پارامتر اول آن ، دستگیره پنجره ای است که می خواهیم مختصات آن را بدست آوریم . پارامتر دوم ، از نوع Rect است و مختصات پنجره درون آن قرار میگیرد . و تابع ClipCursor ، این تابع همان تابعی است که حرکت ماوس را محدود و یا آزاد می کند . حالت کلی این تابع به صورت زیر است : Private Declare Function ClipCursor Lib "user32" Alias "ClipCursor" (lpRect As Any) As Long این تابع یک پارامتر دارد و از نوع Any است . علت استفاده از نوع داده Any این است که دو نوع پارامتر را می توانیم به عنوان ورودی ارسال کنیم . هنگامی که می خواهیم ماوس را در یک منطقه محدود کنیم ، یک متغیر از نوع Rect و برای آزاد کردن ماوس مقداری از نوع Long را به عنوان ورودی ارسال می کنیم . در مثال زیر با نحوه استفاده از این دو تابع آشنا می شوید . ابتدا یک پروؤه جدید ایجاد کنید و کلید روی آن قرار دهید و کدهای زیر را وارد کنید : Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Sub Command1_Click() Dim WinRect As RECT GetWindowRect Me.hwnd, WinRect ClipCursor WinRect End Sub Private Sub Command2_Click() ClipCursor 0& End Sub حالا برنامه را اجرا کنید و کلید اول را فشار دهید . میبینید که ماوس فقط در محیط فرم برنامه شما قادر به حرکت است . شما این محدودیت را میتوانید در حد یک کلید و یا جعبه متن ( TextBox ) و یا ... اعمال کنید . برای ازاد کردن حرکت ماوس باید عدد 0 را به عنوان ورودی به تابع ClipCursor ارسال کنیم . همه چیز درباره Caret : Caret همان نشانگری است که درون جعبه متن دیده میشود و چشمک میزند . شما حتما تاکنون نشانگر های مختلفی را دیده اید به عنوان مثال : زیر خط ، خط عمودی ویا مستطیل مشکی و یا تصاویر دیگر . در ویژوال بیسیک بطور پیش فرض وقتی یک جعبه متن به فرم اضافه می شود ، نشانگر آن به شکل خط عمودی ظاهر می شود اما برنامه ها می توانند نشانگر های مختلفی را نمایش دهند و زمان چشمک زدن نشانگر را تغییر دهند و یا موقعیت آن را تعیین کنند ، بنابراین ما هم می توانیم چنین کاری را در پروژههایمان انجام دهیم . برای اینکار از تابع CreateCaret استفاده می کنیم . از این تابع برای معرفی یک نشانگر جدید استفاده می شود . حالت کلی این تابع به صورت زیر است : Private Declare Function CreateCaret Lib "user32" Alias "CreateCaret" (ByVal hwnd As Long, ByVal hBitmap As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long اولین پارامتر آن hwnd ( دستگیره ) پنجره ای است که مالک Caret است . ( یعنی پنجره ای که می خواهیم Caret جدید را در آن اعمال کنیم ) دومین پارامتر hBitmap دستگیره تصویری است که می خواهیم از آن به عنوان Caret استفاده کنیم وسومین پارامتر nWidth عرض Caret می باشد . پارامتر آخر nHeight ارتفاع Caret را تعیین میکند . نکاتی که در هنگام استفاده از این تابع باید بدانیم : اگر مقدار پارامتر hBitmap برابر با Null قرار گیرد به معنای استفاده از حالت عادی Caret می باشد ، در غیر این صورت هر عددی قرار گیرد به عنوان دستگیره تصویر مورد نظر استفاده خواهد شد . اگر hBitmap دستگیره مربوط به یک تصویر باشد ، پارامتر های nWidth و nHeight نادیده گرفته خواهند شد و تصویر با طول و عرض واقعی خودش نمایش داده می شود . رنگهای تصویر نمایش داده شده به عنوان Caret معکوس خواهند شد ، بنابر این اگر می خواهید تصویر با رنگ های مورد علاقه خود تان نمایش داده شود ، بهتر است پس از طراحی تصویر مورد نظر ، با استفاده از نرم افزار های گرافیکی رنگهای آن را معکوس کنید . اگر پارامتر nWidth برابر با صفر قرار گیرد به معنای استفاده از عرض پنجره مالک به عنوان عرض Caret می باشد . اگر پارامتر nHeight برابر با صفر قرار گیرد به معنای استفاده از ارتفاع پنجره مالک به عنوان ارتفاع Caret می باشد . پس از استفاده از تابع CreateCaret ، برای نمایش Caret حتما از تابع ShowCaret استفاده کنید . زمانی که از تابع CreateCaret استفاده می کنید باید فوکوس را به پنجره مورد نظر داده باشید . اگر عملیات تابع موفقیت آمیز باشد ، مقدار غیر صفر و در غیر این صورت صفر برگشت داده خواهد شد . تابع ShowCaret : از این تابع برای نمایش Caret استفاده می شود . حالت کلی این تابع به صورت زیر است : Private Declare Function ShowCaret Lib "user32" Alias "ShowCaret" (ByVal hwnd As Long) As Long تنها پارامتر آن دستگیره پنجره ای است که مالک Caret می باشد . نکاتی را در زمان استفاده از این تابع باید به خاطر داشته باشید : اگر مقدار پارامتر hwnd را برابر با Null قرار دهید تابع ، مالک Caret را کنترلی در نظر می گیرد که اکنون فوکوس را در اختیار دارد . اگر قبلا Caret به وسیله تابع HideCaret مخفی شده باشد ، به تعداد دفعاتی که تابع HideCaret را صدا زده باشید باید برای ظاهر شدن مجدد Caret ، تابع Showcaret را صدا بزنید . تابع HideCaret : برای مخفی کردن Caret از این تابع استفاده می شود . حالت کلی این تابع به صورت زیر است : Private Declare Function HideCaret Lib "user32" Alias "HideCaret" (ByVal hwnd As Long) As Long تنها پارامتر آن دستگیره پنجره ای است که مالک Caret می باشد . اگر مقدار پارامتر hwnd را برابر با Null قرار دهید تابع ، مالک Caret را کنترلی در نظر می گیرد که اکنون فوکوس را در اختیار دارد پس از استفاده از این تابع ، Caret از بین نمی رود بلکه مخفی خواهد شد . تابع DestroyCaret : از این تابع برای از بین بردن Caret استفاده می شود . حالت کلی این تابع به صورت زیر است : Private Declare Function DestroyCaret Lib "user32" Alias "DestroyCaret" () As Long این تابع هیچ پارامتر ورودی ندارد و مقدار برگشتی آن در صورت موفقیت آمیز بودن عملیات تابع ، مقداری غیر صفر خواهد بود و در غیر اینصورت صفر را بر می گرداند . تابع GetCaretPos : این تابع محل قرار گرفتن Caret در پنجره مالک آن را بدست می آورد . حالت کلی این تابع به صورت زیر است : Private Declare Function GetCaretPos Lib "user32" Alias "GetCaretPos" (lpPoint As POINTAPI) As Long تنها پارامتر ورودی این تابع از نوع ساختار POINTAPI است و موقعیت Caret بصورت شماره سطر و ستون در ان قرار میگیرد . تابع SetCaretPos : موقعیت Caret درون پنجره مالک آن را تعیین میکند. حالت کلی این تابع به صورت زیر است : Private Declare Function SetCaretPos Lib "user32" Alias "SetCaretPos" (ByVal x As Long, ByVal y As Long) As Long پارامتر X موقعیت افقی Caret و پارامتر Y موقعیت عمودی caret را تعیین می کند . تابع GetCaretBlinkTime : از این تالع برای بدست آوردن زمان چشمک زدن Caret استفاده می شود . حالت کلی این تابع به صورت زیر است : Private Declare Function GetCaretBlinkTime Lib "user32" Alias "GetCaretBlinkTime" () As Long اگر عملیات تابع موفقیت آمیز باشد ، مقدار برگشتی تابع برابر با زمان چشمک زدن Caret بر حسب میلی ثانیه است و در غیر اینصورت مقدار صفر را بر می گرداند . تابع SetCaretBlinkTime : کاربران ویندوز می توانند زمان چشمک زدن Caret را از درون Control Panel تنظیم کنند . برای این کارباید به قسمت Keyboard از Control Panel مراجعه کرد . اما اگر بخواهیم این کار را با استفاده از برنامه نویسی و از درون برنامه های خودمان انجام دهیم باید از تابع SetCaretBlinkTime استفاده کنیم . حالت کلی این تابع به صورت زیر است : Private Declare Function SetCaretBlinkTime Lib "user32" Alias "SetCaretBlinkTime" (ByVal wMSeconds As Long) As Long تنها پارامتر ورودی آن ، زمان چشمک زدن Caret را بر حسب میلی ثانیه تنظیم می کند . به نکات زیر توجه کنید : زمان تعیین شده برای چشمک زدن Caret برای تمام برنامه هایی که در محیط ویندوز اجرا می شوند یکسان است و تغییر دادن این مدت زمان چه از درون Control Panel و چه از طریق تابع SetCaretBlinkTime بر روی تمام برنامه ها تاثیر می گذارد . زمان بدست آمده از تابع GetCaretBlinkTime و زمان داده شده به تابع SetCaretBlinkTime بر حسب میلی ثانیه می باشند . در مثال زیر با توابعی که گفته شده بیشتر آشنا می شوید . ابتدا یک پروژه جدید ایجاد کنید . دو عدد label به فرم اضافه کنید . خاصیت Caption از Label2 را برابر با Blink Time قرار دهید . هر دو Label را روبروی هم قرار دهید . یک TextBox هم به فرم اضافه کنید . سپس یک HScrollbar به فرم اضافه کنید و خاصیت LargChange آن را برابر با 100 و خاصیت Max را برابر با 5000 و خاصیت Min را برابر با 100 و خاصیت SmallChange را برابر با 100 قرار دهید . سپس دو کلید به فرم اضلفه کنید و در نهایت یک PictureBox به فرم اضافه کنید و خاصیت Visible آن را برابر با False قرار دهید و AutoSize آن را True کنید و سپس کد های زیر را وارد کنید . البته قبل از وارد کردن کدها ادرس یک عکس کوچک با فرمت bmp یا GIF یاPNG را به شی PictureBox دهید . برای مثال میتوانید آدرس زیر را بدهید : C:\Program Files\Microsoft Visual Studio\Common\VSS\FOLDER.GIF البته آدرس درایوی را که برنامه ویژوال استودیو در ان نصب است را وارد کنید . اگر میخواهید تصویری که انتخاب کرده ای با رنگ های اصلی نمایش داده شود ، ابتدا رنگهای آن را معکوسی کنید . در اینجا به پایان قسمت چهارم رسیدیم . پس تا قسمت پنجم خدا نگهدار . فایل تایپ شده این آموزش رو هم ضمیمه می کنم . |
|
|
|
![]() |
| علاقه مندی ها (Bookmarks) |
| كاربران در حال ديدن تاپیک: 1 (0 عضو و 1 مهمان) | |
| ابزارهاي تاپیک | |
| نحوه نمايش | |
|
|