PDA

View Full Version : سوال: ساخت یک روبات ساده با ویژوال بیسیک



CrazyMEmber
دوشنبه 13 بهمن 1393, 09:04 صبح
سلام دوستان

من یک برنامه دارم که باید همیشه در حال اجرا باشه روی سیستمم.ولی چون نسخه Trial برنامه هست هر 20 دقیقه کامل بسته میشه برنامه و باید دوباره بازش کنم. حالا من میخوام یک برنامه یا یه بات با ویژوال بیسیک 6 بنویسم که هر 20 دقیقه proccess هامو چک کنه و اگه برنامه بسته شده خودش برنامه رو باز کنه و روی دکمه Start برنامه کلیک کنه. به همین سادگی. خیلی نیاز دارم لطفا اگه میشه راهنماییم کنید تا حد متوسط با ویژوال بیسیک آشنایی دارم چند تا برنامه هم نوشتم اگه راهنماییم کنید ممنون میشم

imanx7
دوشنبه 13 بهمن 1393, 11:07 صبح
احیانا اون برنامه Connectify نیست ؟! :D
اگه بخوای میتونم واست بنویسمش :))))

misamisa
دوشنبه 13 بهمن 1393, 11:12 صبح
آره برنامه Connectify هست :))


طراحی سایت (https://www.wisam.ir/webdesign/) | سئو (https://www.wisam.ir/seo/)
سئو اینستاگرام (https://www.wisam.ir/seo/instagram-optimization/) | www.wisam.ir (https://www.wisam.ir/)
دیجیتال مارکتینگ (https://www.wisam.ir/) | سوشیال مارکتینگ (https://www.wisam.ir/)

لیپوماتیک (https://mehromahcenter.com/lipomatic/) | Mehromahcenter.com (https://mehromahcenter.com/)
نرم افزار باشگاهی (https://madaktosport.com/%d9%86%d8%b1%d9%85-%d8%a7%d9%81%d8%b2%d8%a7%d8%b1-%d8%a8%d8%a7%d8%b4%da%af%d8%a7%d9%87%db%8c/) | Madaktosport.com (https://madaktosport.com/)
لیپوماتیک مهر وماه (https://mehromahcenter.com/) | گیت ورود و خروج (https://madaktosport.com/%da%af%db%8c%d8%aa-%d9%88%d8%b1%d9%88%d8%af-%d9%88-%d8%ae%d8%b1%d9%88%d8%ac/)

CrazyMEmber
دوشنبه 13 بهمن 1393, 13:20 عصر
نه connectify نیست از connectify خیلی ساده تره. وقتی 20 دقیقش تموم میشه کامل برنامه بسته میشه از پراسس ها هم حذف میشه و دوباره باید اجراشه.میخوام فرمول کلی شو یادبگیرم اگه مقاله ای چیزی دارید برام بزارید لطفا یا راهنماییم کنید ممنون میشم خیلی لازم دارم

meys34
دوشنبه 13 بهمن 1393, 14:20 عصر
روش استاندارش اینه:


1- اگر caption برنامه متغیر نیست (کار خیلی راحت میشه):

میشه با استفاده از تابع FindWindow vbNullString, "Window Caption" مداوم چک کنید
که برنامه در حال اجرا هست یا نه... (با یه تایمر 1 ثانیه ای)



2- ولی اگر متغیر باشه:

با استفاده از تابع EnumWindows هندل تک تک پنجره ها رو بدست بیارید (از اینجاش زیاد خوشم نمیاد... یکم سخته...)
بعد به ترتیب به کمک GetWindowThreadProcessId و OpenProcess و در آخر GetModuleFileNameEx آدرس فایل exe رو بدست بیارید...
و در نهایت چک کنید که برنامه مورد نظر در حال اجرا هست یا نه...

CrazyMEmber
دوشنبه 13 بهمن 1393, 22:47 عصر
داداش مرسی بابت راهنماییت ولی بعدشم یه راهنمایی بکن میخوام بعد از این که چک کرد اگه برنامه بسته شده بود دوباره از اون آدرسی که من بهش میدم مثلا C:\file.exe دوباره اجراش کنه و روی دکمه Start اش کلیک کنه خود به خود. خیلی برام مهمه خواهش می کنم اگه چیزی میدونین راهنماییم کنین

meys34
سه شنبه 14 بهمن 1393, 10:30 صبح
اجرا کردن برنامه، با دستور shell هست:
shell "c:\file.exe"
بعد از اجرا، باید هندل پنجره رو پیدا کنی و با کمک تابع FindWindowEx هندل دکمه استارت رو پیدا کنید...

برای شبیه سازی کردن کلیک دو دستور هست... امتحان کنید ببینید کدوم جواب میده...
اولی:
r = SendMessage(wHwnd, &H201, ByVal 0&, ByVal 0&) 'WM_LBUTTONDOWN
r = SendMessage(wHwnd, &H202, ByVal 0&, ByVal 0&) 'WM_LBUTTONUP
دومی:
r = SendMessage(wHwnd, &HF5, ByVal 0&, ByVal 0&)'BM_CLICK



(اگر دکمه استارت زیرمجموعه یه هندل دیگه باشه، لازمه که تابع FindWindowEx رو چند دفعه فراخوانی کنید...)
بهتره از نرم افزار Spy++ کمک بگیرید... مثل تصویر زیر


128150

YasserDivaR
چهارشنبه 15 بهمن 1393, 00:33 صبح
Baidu PC Faster رو نصب کنBaidu WiFi Hotspot رایگان داره
اون برنامه رو قیدشو بزن:ی

meys34
پنج شنبه 16 بهمن 1393, 10:44 صبح
Baidu PC Faster رو نصب کنBaidu WiFi Hotspot رایگان داره
اون برنامه رو قیدشو بزن:ی

سلام

شروع کننده تاپیک داره میگه connectify نیست... دقت کنید:


نه connectify نیست از connectify خیلی ساده تره. وقتی 20 دقیقش تموم میشه کامل برنامه بسته میشه از پراسس ها هم حذف میشه و دوباره باید اجراشه.میخوام فرمول کلی شو یادبگیرم اگه مقاله ای چیزی دارید برام بزارید لطفا یا راهنماییم کنید ممنون میشم خیلی لازم دارم

CrazyMEmber
پنج شنبه 16 بهمن 1393, 11:08 صبح
اجرا کردن برنامه، با دستور shell هست:
shell "c:\file.exe"
بعد از اجرا، باید هندل پنجره رو پیدا کنی و با کمک تابع FindWindowEx هندل دکمه استارت رو پیدا کنید...

برای شبیه سازی کردن کلیک دو دستور هست... امتحان کنید ببینید کدوم جواب میده...
اولی:
r = SendMessage(wHwnd, &H201, ByVal 0&, ByVal 0&) 'WM_LBUTTONDOWN
r = SendMessage(wHwnd, &H202, ByVal 0&, ByVal 0&) 'WM_LBUTTONUP
دومی:
r = SendMessage(wHwnd, &HF5, ByVal 0&, ByVal 0&)'BM_CLICK



(اگر دکمه استارت زیرمجموعه یه هندل دیگه باشه، لازمه که تابع FindWindowEx رو چند دفعه فراخوانی کنید...)
بهتره از نرم افزار Spy++ کمک بگیرید... مثل تصویر زیر


128150

خیلی ممنون خیلی کمکک کرد راهنماییتون تا الان برنامه رو تا جایی که چک می کنه و اگه بسته باشه دوباره اجراش می کنه نوشتم فقط مونده این قسمت که روی دکمه استارتش خود به خود کلیک کنه . اگه یکم واضح تر این قسمت رو توضیح بدید ممنون میشم این کدی که نوشتید:
r = SendMessage(wHwnd, &H201, ByVal 0&, ByVal 0&) 'WM_LBUTTONDOWN

r = SendMessage(wHwnd, &H202, ByVal 0&, ByVal 0&) 'WM_LBUTTONUP
دومی:
r = SendMessage(wHwnd, &HF5, ByVal 0&, ByVal 0&)'BM_CLICK
این خودش رو دکمه استارت برنامه کلیک می کنه ؟ منظور من از دکمه استارت استارت کیبورد رو نمیگم یه دکمه روی برنامه هست به اسم استارت که وقتی اونو میزنم برنامه شروع به کار میکنه روی اون چجوری به برنامه بگم کلیک کنه منظورم از کلیک اینه که اون دکمه روی برنامه فشار داده بشه شبیه سازی کلیک کردن مهم نیست زیاد.اگه دستوری یا تابعی میشناسید راهنمایی کنید لطفا. خیلی ممنون. یه توضیحی هم در مورد کدی که نوشتین اگه میشه بدین مثلا اون HWND چی هست ؟ یا WM_LBUTTONDOWN ؟

meys34
پنج شنبه 16 بهمن 1393, 15:22 عصر
سلام

با استفاده از تابع SendMessage دستوراتی که توسط موس به اون دکمه ارسال میشه رو میفرستیم و
اون برنامه هم فکر میکنه که کاربر روش کلیک کرده...

فرض کنید می خوایم مثل عکس بالا روی عدد 7 کلیک کنیم:

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long

Private Sub Command1_Click()
Dim wHwnd As Long

wHwnd = FindWindowEx(0, 0, "CalcFrame", "Calculator")

wHwnd = FindWindowEx(wHwnd, 0, "CalcFrame", vbNullString)
wHwnd = FindWindowEx(wHwnd, 0, "#32770", vbNullString)

wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)


wHwnd = FindWindowEx(wHwnd, 0, "Button", vbNullString)

wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)

SendMessage wHwnd, &HF5, ByVal 0&, ByVal 0& 'BM_CLICK
End Sub



شماره هر رو توی عکس نوشتم... از خط 8 شروع میشه تا خط 20 ام...

CrazyMEmber
شنبه 18 بهمن 1393, 09:57 صبح
سلام داداش خیلی ممنون من الان فقط یه مشکلی دارم ببین
من میخوام روی اون قسمتی که توی عکس مشخص کردم کلیک بشه اینم کدی هست که نوشتم ولی کار نمی کنه یه نگاه می کنی ببینی مشکل از کجاس

wHwnd = FindWindowEx(0, 0, "#32770 (Dialog)", 0)
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = FindWindowEx(wHwnd, 0, "Static", "Tab")
wHwnd = FindWindowEx(wHwnd, 0, "#32770", "Form1")
wHwnd = FindWindowEx(wHwnd, 0, "Static", "v3.16")
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)
wHwnd = GetNextWindow(wHwnd, 2)
SendMessage wHwnd, &HF5, ByVal 0&, ByVal 0& 'BM_CLICK

128246

meys34
شنبه 18 بهمن 1393, 21:18 عصر
سلام

تابع GetNextWindow برای اینه که توی هر زیر مجموعه پنجره پایینی (یا بالایی) رو پیدا کنید...

مشکل شما با برنامه تون اینه که پنجره #32770 پنجره ای منحصر به فرد نیست
و همون اول کار باید با یه حلقه اونو پیدا کنیم...


Option Explicit

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long

Private Sub Command1_Click()
Dim wHwnd As Long

Do
wHwnd = FindWindowEx(0, wHwnd, "#32770", vbNullString)
If wHwnd = 0 Then Exit Sub
Loop Until FindWindowEx(wHwnd, 0, "Static", "TAB")


wHwnd = FindWindowEx(wHwnd, 0, "Static", "TAB")
wHwnd = FindWindowEx(wHwnd, 0, "#32770", "Form1")
wHwnd = FindWindowEx(wHwnd, 0, "Button", "Free Trial")

SendMessage wHwnd, &HF5, ByVal 0&, ByVal 0& 'BM_CLICK
End Sub