اطلاعیه

Collapse
No announcement yet.

آموزش: دسترسی به یک کنترل و مقدارش در برنامه ای که سورسش رو ندارین!

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    آموزش: دسترسی به یک کنترل و مقدارش در برنامه ای که سورسش رو ندارین!

    در این تاپیک قصد دارم روشی رو آموزش بدم که میتونید به یک کنترل روی فرمی که سورس اون رو ندارید، دسترسی داشته باشید و مقدار اون رو بخونید.

    یک مزیت این ترفند مواقعی هست که مثلاً شما یک GUI از یک وسیله دارین که به سورس اون دسترسی ندارین مثلاً یک اسکوپ دیجیتال که میتونه مقدار لحظه ای ولتاژ رو نشون بده یا هر چیز دیگه ای که بتونید تصور کنید، حالا شما برای اتوماتیک کردن یا اضافه کردن ویژگی جدید به برنامه محدودیت دارین ولی با این ترفند به راحتی میتونید به خروجی های برنامه دسترسی داشته باشین و کارهای Real-Time رو به راحتی انجام بدین و نیازی هم به سروکله زدن با کد و پروتکل وسیله ندارین.
    در مثال، فرکانس کلاک CPU در برنامه CPU-Z رو به این روش روی فرمی که خودم ایجاد کردم نشون میدم.

    من کدها رو در VB.NET مینویسم ولی به راحتی خودتون میتونید معادل #C اونها رو هم به دست بیارید در ضمن مهم نیست برنامه ای که میخواین ازش بخونید با چه زبانی نوشته شده باشه.

    هر فرم یا کنترل روی فرم (مثل TextBox, Panel, Label, CheckBox, RadioButton و ...) در ویندوز دارای یک کد منحصر به فرد به اسم Handle هست که سیستم عامل ویندوز از طریق این هندل به اون دسترسی داره. در صورتی که شما هندل فرم و کنترل رو داشته باشین میتونید به اون کنترل دسترسی داشته باشین و مقدارش رو بخونید.

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

    برای خواندن مقادیر هندل میتونید از برنامه کوچک ++WinSpy استفاده کنید.
    روش کار هم خیلی راحته، کافیه ابزار نشان مانند شکل زیر رو روی فرم یا کنترل مورد نظر بکشید و رها کنید تا مشخصاتش رو به دست بیارید:


    بعد مقدار Handle رو کپی کنید و در محلی که در کد برنامه میگم Paste کنید(روشهای دیگه هم هست ولی این ساده ترین و سرراست ترین روشه).

    لازمه که در ابتدای برنامه (قبل از اعلان نام کلاس) کد زیر رو اضافه کنید تا بتونید با هندل کار کنید:
    کد PHP:
    Imports System.Runtime.InteropServices 


    تابع زیر رو هم در قسمت Public کلاس (زیر نام کلاس) تعریف کنید:
    کد PHP:
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtrByVal msg As Integer_
      ByVal wParam 
    As IntPtrByVal lParam As IntPtr) As IntPtr 


    در رویداد Load فرم هم کافیه کد زیر رو اضافه کنید:
    کد PHP:
    CPU_Clock = &H28084C
        tmrUpd100ms
    .Enabled True 

    مقداری که در جلوی متغیر CPU_Clock نوشته شده، همون مقدار هندل هست که کپی کردین، توجه کنید که چون این مقدار هگزادسیمال هست باید از پیشوند H& (در #C از 0x) استفاده بشه.
    خط دوم هم مربوط به فعالسازی تایمری هست که در هر تیک اون، مقدار از برنامه CPU-Z خوانده میشه و روی فرم ما پدیت میشه. شما میتونید با تبدیل خروجی که string هست به double کارهای جالبتری هم با اون انجام بدین!

    در رویداد تیک تایمر هم کد زیر رو نوشتم که توضیحات کافی هم داره:
    کد PHP:
     'Alloc memory for the buffer that receives the text = 5 Bytes [you can change this value, increase for fast changes)
        
    Dim Handle As IntPtr Marshal.AllocHGlobal(5)

        &
    #039;send (message = 13) to the notepad window [you shouldn't change this value!]
        
    ' and (wparam = 7) [you should change this value to Maximum length of your text]
        
    Dim NumText As Integer SendMessage(CPU_Clock137Handle)

        &
    #039;copy the characters from the unmanaged memory to a managed string
        
    Dim strValue As String Marshal.PtrToStringUni(Handle)

        &
    #039;Dim strValue As String = Marshal.PtrToStringUni(Handle)
        
    lblCPU.Text strValue 


    و این هم نتیجه برنامه:


    امیدوارم این تاپیک برای شما مفید باشه.
    لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
    لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
    با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
    اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
    يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

    #2
    پاسخ : آموزش: دسترسی به یک کنترل و مقدارش در برنامه ای که سورسش رو ندارین!

    چند نکته (البته مدتهاست که دیگه با این چیزها ور نرفتم؛ اگه احیانا اشتباه بود اصلاح کنید)
    1- هندلها رو میتونید از طریق بدست آوردن هندل پنجره اصلی برنامه مورد نظر با استفاده از عنوانش و یا کلاسش بدست بسیارید و دیگه هر بار کپی نکنید (یعنی خود برنامه اینکار رو بکنه). کنترلها در واقع زیر پنجره های پنجره اصلی هستند که نسبت به اون یه سلسله مراتب دارند. یعنی شما بگید که پنجمین زیر پنجره پنجره اصلی رو میخواین که این همیشه ثابته (بطور کلی هر پنجره چند زیرپنجره یا child داره که خود اونها هم میتونند parent یکسری پنجره دیگه باشند)
    2- همراه نرم افزار Visual studio هم برنامه ای به اسم spy++ هست که در این مواقع خیلی به برنامه نویس کمک میکنه
    3- با تابع postmessage از توابع API میتونید علاوه بر مثلا خواندن داده های یه کنترل مثل EditBox رویدادهایی مثل کلیک کردن یک button رو هم شبیه سازی کنید
    مثال برای کاربرد :
    یه فایل اجرایی یه دستگاهی رو داشتیم که کاربر باید یه چیزهایی رو داخل کنترلها ست میکرد و بعد دکمه Run رو میزد. اینطوری کاربر حدکثر یک یا دو بار در دقیقه میتونست برنامه رو پدیت کنه ولی با ترفند بالا تونستیم به تعداد بسیار زیاد از برنامه کار بکشیم )
    دوران دانشجویی هم یادمه یکی از بچه ها یه برنامه پیانو داشت که با استفاده از صفحه کلید پیانو میزد؛ با همین ترفند ابتدا نت های یه آهنگ رو به برنامه میدادیم و اون پیغامهای فشرده شدن کلیدهای مدنظر رو به اون برنامه میفرستاد و دیگه لازم نبود خودمون از صفحه کلید استفاده کنیم

    دیدگاه


      #3
      پاسخ : آموزش: دسترسی به یک کنترل و مقدارش در برنامه ای که سورسش رو ندارین!

      در پست قبلی گفتم که با روش گفته شده هر بار که برنامه ای که میخوایم ازش بخوانیم، باز و بسته میشه مقدار هندل تغییر می کنه و لازمه که با استفاده از برنامه ++WinSpy دوباره مقدار هندل رو به دست بیاریم و کد رو پدیت کنیم. با روش برنامه زیر نیازی به این کار نیست ولی در عوض در کدنویسی اولیه کمی زمان طولانی تری نیاز داریم. در این برنامه فقط از دو تابع FindWindow و FindWindowEx استفاده شده. مقادیر حلقه های داخل برنامه با توجه به برنامه ++WinSpy به دست اومدن که برای تست شما برنامه ها رو هم ضمیمه کردم.

      دانلود فایل پروژه

      لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
      لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
      با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
      اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
      يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

      دیدگاه

      لطفا صبر کنید...
      X