PDA

View Full Version : بدست آوردن GetElementById یک شی در web browser



ho3ein.3ven
جمعه 09 تیر 1391, 09:51 صبح
سلام بر همگی
دوستان راهی هست که بشه در وب بروزر وقتی که روی یک شی کلیک می کنی مشخصه getelementbyid اون بدست بیاد . چون من الان هر کاری کردم نتونستم از طریق سورس این مشخصه رو پیدا کنم .
شی من یک دکمه هست که می خوام روی اون کلیک کنم.
این سورس وب مربوط به اون قسمت


<tdcolspan="2" align="left"><strong> </strong><br /></td>






</tr>







<tr>



<td>&nbsp;</td>



<td><inputtype="image" src="images/sendbt.png" /></td>



</tr>



</table>







</form>



<scriptlanguage=javascript>if((document.smsform.mobile.value)>1){var set=document.getElementById('mobile'); set.setAttribute('readonly');}else



{var set=document.getElementById('mobile');set.removeAt tribute('readonly');



}



</script>

javadt
جمعه 09 تیر 1391, 10:11 صبح
جستجو کنید تاپیک های زیادی در این موضوع هست
از این کد میتونی برای ارسال فرم استفاده کنید

WebBrowser1.Document.Forms(0).elements("v").Click

ho3ein.3ven
جمعه 09 تیر 1391, 10:34 صبح
دستت درد نکنه به خاطر پاسخت
ولی اگه میشه خودت یه راهنمایی کن.
یا تاپیک معرفی کن

MohammadGh2011
جمعه 09 تیر 1391, 10:58 صبح
سلام عليکم
دقيق منظورتون رو نفهميدم،
شما اگه از مرورگرهاي Opera و Chrome استفاده ميکنيد با راست کليک بر روي شيء مورد نظرتون و با انتخاب Inspect Element ميتونيد نام اون شيء و ديگر مشخصه ها رو به دست بياريد.
اگه به جواب نرسيديد بيشتر توضيح بديد.


موفق باشيد

ho3ein.3ven
جمعه 09 تیر 1391, 11:14 صبح
سلام . ممنون به خاطر پاسخ
منظورم که خیلی واضح . تو وب بروزر می خوام روی یک دکمه کلیک کنم ولی اون دکمه اسم نداره . می خواستم ببینم چطور میشه روی اون دکمه کلیک کرد.

ho3ein.3ven
جمعه 09 تیر 1391, 11:15 صبح
از گوگل کروم هم استفاده کردم ولی با گزینه Inspect Element نتونستم اسم شی رو بدست بیارم

MohammadGh2011
جمعه 09 تیر 1391, 11:20 صبح
آدرس سايت مورد نظرتون رو بديد.

ho3ein.3ven
جمعه 09 تیر 1391, 11:42 صبح
آدرس سایت رو نمیشه اینجا نوشت
کد html رو که اینجا گذاشتم

oYaMaa
جمعه 09 تیر 1391, 11:44 صبح
سلام...

می تونید اول یه تکست باکس یا دکمه یا هر چیزی رو که element اون رو می دونی چیه از طریق فوکوس بری روش بعد با زدن دکمه Tab بری روی همون دکمه ای که element نداره و از طریق sendkeys روش کلیک کنید.
از طریق کد زیر هم می تونید فوکوس رو روی اون element ببرید.

x = WebBrowser1.Document.all("").focus()



موفق باشید...

MohammadGh2011
جمعه 09 تیر 1391, 11:50 صبح
سلام
ببينيد اگه اون شيء نام نداره شما ميتونيد ازطريق ID رو اون کليک کنيد مثلا در انجمن VB6 اينطوري بايد روي دکمه ي "ايجاد تاپيک جديد" کليک کرد.
يعني اول focus ميره روي اون شيء و سپس با SendKeys رو اون کليک ميشه.
Private Sub Command1_Click()
On Error Resume Next
WebBrowser1.Document.getElementById("newthreadlink_top").focus
SendKeys "{enter}", True
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate "http://barnamenevis.org/forumdisplay.php?43-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1-6-VB"
End Sub


موفق باشيد

sa.ahmadzade
جمعه 09 تیر 1391, 11:56 صبح
در صفحه وبی که لازم دارم دارم فایل ها اتوماتیک آپلود شوند
یک آپلود فایل موجود است می خواهم آدرس مورد نظرم بعد از بارگداری صفحه در آپلودفایل انتخاب شود، بدون اینکه پنجره انتخاب فایل برای کاربر نمایش داده شود
باتشکر

MohammadGh2011
جمعه 09 تیر 1391, 12:00 عصر
در صفحه وبی که لازم دارم دارم فایل ها اتوماتیک آپلود شوند
یک آپلود فایل موجود است می خواهم آدرس مورد نظرم بعد از بارگداری صفحه در آپلودفایل انتخاب شود، بدون اینکه پنجره انتخاب فایل برای کاربر نمایش داده شود
باتشکر
سلام عليکم
لطفا براي سوال خود تاپيک جداگانه اي در انجمن مخصوص آن ايجاد کنيد تا اساتيد بهتر راهنمايي کنند.


موفق باشيد

just4froum
جمعه 09 تیر 1391, 12:01 عصر
با سلام :

اون قسمتی از سورس که گذاشتین بعید میدونم مال اونجایی باشه که می خواین کلیک کنید یا حداقل ناقص گذاشتین. اگر می تونید URL صفحه را بگذارید .

1- برای کلیک کردن بر روی دکمه هایی که ID دارند می تونید از این استفاده کنید :
WebBrowser1.Document.All("Button ID").Click

2- اما بعضی از دکمه ها هستند ID ندارند ولی Name دارند برای کلیک بر روی دکمه هایی که فقط Name دارند می توانید از این استفاده کنید :
Dim targetinputname As String
targetinputname = "Button Name"
For n = 0 To WebBrowser1.Document.All.length - 1
If WebBrowser1.Document.All(n).tagName = "INPUT" Then
If WebBrowser1.Document.All(n).Name = targetinputname Then
WebBrowser1.Document.All(n).Click
Exit Sub
End If
End If
Next

targetinputname رو برابر اسم Button قرار دهید.

موفق باشید.

ho3ein.3ven
جمعه 09 تیر 1391, 12:17 عصر
با تشکر از همگی .
چطور میشه فهمید که چه موقع وب بروزر صفحه رو به صورت کامل لود کرده ؟ رویداد ddcument complete وقتی که صفحه کامل لود نشده هم اجرا میشه.

MohammadGh2011
جمعه 09 تیر 1391, 12:38 عصر
چطور میشه فهمید که چه موقع وب بروزر صفحه رو به صورت کامل لود کرده ؟ رویداد ddcument complete وقتی که صفحه کامل لود نشده هم اجرا میشه.
به اين صورت ميشه فهميد:
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
If (pDisp Is WebBrowser1.object) Then
Print "LOading Completed"
End If
End Sub

ho3ein.3ven
جمعه 09 تیر 1391, 13:06 عصر
مممنون
یک سوال دیگه . وقتی که توی وب بروزر یک کادر پیام مثل msgbox خود وی بی باز میشه چطور میشه کاری کرد که برنامه خودش به صورت اتوماتیک اوکی رو بزنه؟

just4froum
جمعه 09 تیر 1391, 13:17 عصر
من خودم یه بار یه همچین مشکلی رو داشتم.

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

محسن واژدی
جمعه 09 تیر 1391, 14:34 عصر
سلام علیکم
برای کلیک و هر عمل دیگری بر روی اشیائی که id و name ندارند میتوانیم از indexشون استفاده کنیم، برای مثال اگر در web-browser به گوگل وارد شده و متنی را تایپ کنیم، برای فشردن دکمه جستجو (اگه id,name نداشته باشه نهایتا از index برای ارسال کلیک استفاده می کنیم):

Private Sub Form_Load()
WebBrowser1.Navigate "http://google.com"
End Sub

Private Sub Command1_Click()
WebBrowser1.Document.Forms(0).elements(6).Click
End Sub


موفق باشید

ho3ein.3ven
جمعه 09 تیر 1391, 16:04 عصر
دست شما درد نکنه . ولی این مشکلم حل شد . الان فقط مشکلم اوکی کردن پیغامی هست که توسط وب باز می شه.

MohammadGh2011
جمعه 09 تیر 1391, 16:48 عصر
دست شما درد نکنه . ولی این مشکلم حل شد . الان فقط مشکلم اوکی کردن پیغامی هست که توسط وب باز می شه.
سلام عليکم
شما حتما دستوراتي که نوشتين يه مشکلي داره به خاطر همين پيغام ميده،در غير اينصورت همونطور که جناب just4froum فرمودند ميتونيد هندل اون رو به دست بياريد و روش OK کنيد.
در مورد به دست آوردن هندل جستجو کنيد قبلا در موردش بحث شده.


موفق باشيد

ho3ein.3ven
جمعه 09 تیر 1391, 18:41 عصر
نه دستوراتی که نوشتم هیچ مشکلی نداره . پیغام از خود سایت داده میشه

محسن واژدی
جمعه 09 تیر 1391, 18:51 عصر
همونطور که جناب just4forum هم فرمودند کدی مینویسیم منتظر نمایش یک پیام با عنوانی مشخص شود، و پس از آنکه پنجره روئیت شده فرم پنجره را انتخاب و دستور close به آن ارسال میکنیم
البته اگه آدرس یا کد خاصی را مدنظر دارید در صورت امکان آن را هم ضمیمه پست کنید تا سریعتر به نتیجه برسیم

موفق باشید

ho3ein.3ven
جمعه 09 تیر 1391, 20:38 عصر
سلام.ممنون از شما
خیلی پست های سایت رو گشتم ولی چیزی متوجه نشدم اگر ممکنه خودتون یه توضیح برام بدین.
عنوان کادر پیام message submitted successfully و متن پیام message submitted successfully و فقط یک گزینه داره که اونم ok هست.
با تشکر

just4froum
جمعه 09 تیر 1391, 21:48 عصر
با سلام :

چون دقیق پیغامو ندارم نمی تونم دقیق برات بنویسم ولی این باید کار کنه. اگر کار نکرد متن message submitted successfully رو دقیق با رعایت بزرگ و کوچکی حروف توی سورس درستش کن.

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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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 Const BM_CLICK = &HF5

Private Sub Form_Load()
Timer.Enabled = True
Timer.Interval = 100
End Sub

Private Sub Timer_Timer()
Dim messageHandle As Long
Dim OKHandle As Long

messageHandle = FindWindow(vbNullString, "Message Submitted Successfully")
OKHandle = FindWindowEx(messageHandle, 0, vbNullString, "OK")

If OKHandle <> 0 Then
SendMessage OKHandle, BM_CLICK, 0, 0
End If
End Sub

ho3ein.3ven
جمعه 09 تیر 1391, 23:47 عصر
با سلام :

چون دقیق پیغامو ندارم نمی تونم دقیق برات بنویسم ولی این باید کار کنه. اگر کار نکرد متن message submitted successfully رو دقیق با رعایت بزرگ و کوچکی حروف توی سورس درستش کن.

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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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 Const BM_CLICK = &HF5

Private Sub Form_Load()
Timer.Enabled = True
Timer.Interval = 100
End Sub

Private Sub Timer_Timer()
Dim messageHandle As Long
Dim OKHandle As Long

messageHandle = FindWindow(vbNullString, "Message Submitted Successfully")
OKHandle = FindWindowEx(messageHandle, 0, vbNullString, "OK")

If OKHandle <> 0 Then
SendMessage OKHandle, BM_CLICK, 0, 0
End If
End Sub
سلام. ممنون به خاطر برنامه ای که قرار دادین.ولی متاسفانه روی برنامه اصلی جواب نگرفتم
یه برنامه ساده دیگه هم نوشتم متاسفانه روی اونم جواب نگرفتم اگه ممکنه ببینید اشکال کار کجاست

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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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 Const BM_CLICK = &HF5

Private Sub Command1_Click()
MsgBox "salam", , "salam"
End Sub
Private Sub Form_Load()
Timer1.Enabled = True
Timer1.Interval = 100
End Sub

Private Sub Timer1_Timer()
Dim messageHandle As Long
Dim OKHandle As Long

messageHandle = FindWindow(vbNullString, "salam")
OKHandle = FindWindowEx(messageHandle, 0, vbNullString, "OK")

If OKHandle <> 0 Then
SendMessage OKHandle, BM_CLICK, 0, 0
End If
End Sub

just4froum
شنبه 10 تیر 1391, 00:13 صبح
ببین برنامه کامل درسته مشکل اینه که شما نباید این دوتا رو در یک برنامه قرار دهید. یعنی باید در دو فایل exe جداگانه قرار دهید.

در کد بالا وقتی msgbox اجرا میشود کل برنامه متوقف می شود و منتظر می ماند تا شما بر روی دکمه OK پیغام کلیک کنید.

MsgBox "salam", , "salam"

شما کد بالا که موجب یک پیغام می شود را در برنامه ای جدا قرار داده و بقیه را در برنامه ای دیگر و میبینید که پیغامو می بنده.

محسن واژدی
شنبه 10 تیر 1391, 08:39 صبح
سلام علیکم
هملانطور که جناب Just4forum هم فرمودند تا زمانی که پیام فعال باشد تایمر در این فاصله نمیتواند عمل کند، روش دیگر برای اینکه هر دو در یک برنامه عمل کنند استفاده از تابع SetTimer است

موفق باشید

ho3ein.3ven
شنبه 10 تیر 1391, 09:45 صبح
سلام . متاسفانه بازم روی برنامه اصلی کار نمی کنه ؟
این یک تصویر از پیغامی که میده :
88969

محسن واژدی
شنبه 10 تیر 1391, 10:42 صبح
سلام علیکم
کد زیر را هم بررسی کنید،
ابتدا این کدها را در یک مادول کد قرار بدین:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName 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 SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Const WM_CLOSE = &H10
Public Const TMR_AUTO_CLOSE_MSG& = &H1
Private mMsgTitle$
Sub AutoCloseMessageTimer(fForm As Form, sMessageTitle$)
mMsgTitle$ = sMessageTitle$
SetTimer fForm.hwnd, TMR_AUTO_CLOSE_MSG&, 1, AddressOf TimerProc
End Sub
Private Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Dim lWH&
lWH& = FindWindow("#32770", mMsgTitle$)
If lWH& > 0 Then
SendMessage lWH&, WM_CLOSE, 0, 0
End If
End Sub

و کد زیر را هم در Unload فرم:
Private Sub Form_Unload(Cancel As Integer)
KillTimer hwnd, TMR_AUTO_CLOSE_MSG&
End Sub


برای نمونه:
Private Sub Command1_Click()
AutoCloseMessageTimer Me, "Message from webpage"
End Sub

موفق باشید

ho3ein.3ven
شنبه 10 تیر 1391, 11:05 صبح
سلام
جواب داد . از تمامی دوستانی که کمک کردند ممنونم

ho3ein.3ven
شنبه 10 تیر 1391, 13:35 عصر
سلام . ببخشید دوستان یه مشکل دیگه پیش اومده. اونجا بود که کلید اینتر رو با SendKeys "{enter}", True ارسال کردیم. این کد کلید اینتر رو به سیستم عامل میفرسته . نمیشه کاری کرد که کلید اینتر رو به خود برنامه بفرسته ؟ چون در این صورت اگر برنامه minimize بشه دیگه برنامه کار نمی کنه چون کلید اینتر زده نمیشه.
ممنون از همگی

ho3ein.3ven
شنبه 10 تیر 1391, 17:45 عصر
دوستان کسی در این باره اطلاعی نداره ؟

محسن واژدی
شنبه 10 تیر 1391, 18:52 عصر
سلام علیکم
کد زیر را بررسی کنید:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_CHAR = &H102

Private Sub Command1_Click()
SendMessage hwnd, WM_KEYDOWN, 0&, 0
SendMessage hwnd, WM_CHAR, vbKeyReturn, 0
SendMessage hwnd, WM_KEYUP, 0&, 0

End Sub


Private Sub Form_KeyPress(KeyAscii As Integer)
MsgBox KeyAscii
End Sub


برای تست خاصیت Key-Preview فرم را بر روی True تنظیم کنید

موفق باشید

ho3ein.3ven
یک شنبه 11 تیر 1391, 12:05 عصر
سلام علیکم
کد زیر را بررسی کنید:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_CHAR = &H102

Private Sub Command1_Click()
SendMessage hwnd, WM_KEYDOWN, 0&, 0
SendMessage hwnd, WM_CHAR, vbKeyReturn, 0
SendMessage hwnd, WM_KEYUP, 0&, 0

End Sub


Private Sub Form_KeyPress(KeyAscii As Integer)
MsgBox KeyAscii
End Sub


برای تست خاصیت Key-Preview فرم را بر روی True تنظیم کنید

موفق باشید
با تشکر فراوان از شما

ho3ein.3ven
یک شنبه 11 تیر 1391, 12:18 عصر
سلام . اینو الان که روی برنامه اصلی امتحان کردم جواب نگرفتم با دستور send keys حواب میده ولی با این دستور جواب نمی گیرم. نمیشه اینتر رو به شی خاصی ارسال کرد . آخه فک کنم این برنامه کلید اینتر رو به فرم ارسال می کنه. با تشکر

محسن واژدی
یک شنبه 11 تیر 1391, 13:08 عصر
سلام . اینو الان که روی برنامه اصلی امتحان کردم جواب نگرفتم با دستور send keys حواب میده ولی با این دستور جواب نمی گیرم. نمیشه اینتر رو به شی خاصی ارسال کرد . آخه فک کنم این برنامه کلید اینتر رو به فرم ارسال می کنه. با تشکر
سلام
بصورت پیش فرض کلید را به فرم ارسال میکند چرا که هندل فرم را برای SendMessage تعریف کرده ایم، در کل اگر بخواهیم روالی را برای ارسال کلید enter به فرم تعریف کنیم، میتوانیم آنرا مشابه زیر تعریف کنیم:

Sub SendEnterKey(lHwnd&)
SendMessage lHwnd&, WM_KEYDOWN, 0&, 0
SendMessage lHwnd&, WM_CHAR, vbKeyReturn, 0
SendMessage lHwnd&, WM_KEYUP, 0&, 0
End Sub


برای مثال برای ارسال enter به text1 موجود بر روی فرمی در وی بی:

Private Sub Command1_Click()
Call SendEnterKey(Text1.hwnd)
End Sub


برای سایر هندل ها هم به همین صورت هندل مورد نظر را به روال SendEnterKey ارسال میکنیم

موفق باشید

ho3ein.3ven
یک شنبه 11 تیر 1391, 17:06 عصر
سلام ممنون از شما . وقتی که برابر با webbrowser1.hwnd قرارش میدم برنامه ارور میده .
کد هام به این صورت :
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Private Const WM_CHAR = &H102
Private Sub SendEnterKey(lHwnd&)
SendMessage lHwnd&, WM_KEYDOWN, 0&, 0
SendMessage lHwnd&, WM_CHAR, vbKeyReturn, 0
SendMessage lHwnd&, WM_KEYUP, 0&, 0
End Sub
Private Sub Command2_Click()

Call SendEnterKey(w.hwnd)

End Sub
مشکل کجاست ؟

just4froum
یک شنبه 11 تیر 1391, 17:13 عصر
متاسفانه در webbrowser نمی توانید از متد hwnd استفاده کنید و باید از توابع API هندل آن را بدست آورید.

البته این تجربه منه شاید راه دیگری باشه !!!:متفکر:

ho3ein.3ven
یک شنبه 11 تیر 1391, 20:48 عصر
خب پس الان چکار کنم ؟

ho3ein.3ven
دوشنبه 12 تیر 1391, 00:31 صبح
دوستان کسی هنوز به نتیجه ای نرسیده ؟

sa.ahmadzade
دوشنبه 12 تیر 1391, 01:33 صبح
ممنون از همکاریتون
ولی این روش رو میدانستم
فقط مشکل این است
در پورتالی که من لازم است توسط مرورگز دست نوشته خودم باز کنم
میبایست یک سری آدرس عکس را به مرورگر بدهم تا آپلود کند
روش کلیک کردن روی شی را میدانم
ولی وقتی به کنترل آپلود فایل میرسم نمی دانم چه مقداری به کنترل آپلود فایل بدهم تا عکس مورد نظر من ادرس انتخابی داخل کنترل شود
هر روشی امتحان می کنم متاسفانه جواب نمی دهد
باتشکر

ho3ein.3ven
دوشنبه 12 تیر 1391, 16:49 عصر
سلام. برادر چرا تو تاپیک من پست میزنی ؟
دوستان کسی نفهمید چطور میشه اینکارو انجام داد ؟

meys34
دوشنبه 12 تیر 1391, 18:49 عصر
دست شما درد نکنه . ولی این مشکلم حل شد . الان فقط مشکلم اوکی کردن پیغامی هست که توسط وب باز می شه.


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

شرمنده تاپیک یکم طولانی شده، من نفهمیدم مشکل کجاست؟

just4froum
دوشنبه 12 تیر 1391, 19:16 عصر
خب پس الان چکار کنم ؟

بفرمایید :

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 Sub Form_Load()
Dim WBhwnd As Long
WBhwnd = FindWindowEx(Me.hwnd, 0, "Shell Embedding", vbNullString)
MsgBox WBhwnd
End Sub

ho3ein.3ven
دوشنبه 12 تیر 1391, 21:08 عصر
سلام. اگه میشه یه توضیح بده.
چون من الان وب بروزر رو جایگزین کردم باز ارور داد.
هندل فرم رو 0 میده . بعد اینکه اگه هندل رو بدست آوردیم چطوری اینتر رو ارسال کنیم.

just4froum
دوشنبه 12 تیر 1391, 21:28 عصر
نه شما چیزی رو جایگذین نکن.

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

و این متغر رو جایگذین کد جناب واژدی کن.

ho3ein.3ven
دوشنبه 12 تیر 1391, 23:32 عصر
سلام . ممنون از شما
متاسفانه بازم جواب نمیده .
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Dim p As Boolean
Private Const WM_CHAR = &H102
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 Sub SendEnterKey(lHwnd&)
SendMessage lHwnd&, WM_KEYDOWN, 0&, 0
SendMessage lHwnd&, WM_CHAR, vbKeyReturn, 0
SendMessage lHwnd&, WM_KEYUP, 0&, 0
End Sub
Private Sub Command2_Click()
Dim WBhwnd As Long
WBhwnd = FindWindowEx(Me.hwnd, 0, "Shell Embedding", vbNullString)
Call SendEnterKey(WBhwnd)

End Sub

ho3ein.3ven
سه شنبه 13 تیر 1391, 23:40 عصر
سلام . متوجه نشدید مشکل از کجاست ؟

just4froum
چهارشنبه 14 تیر 1391, 15:14 عصر
با سلام . کدی که من نوشتم هندل وب بروزر رو بر می گردونه ولی احتمالا کاری که شما می خواین انجام بدین بدین روش عملی نیست.

میشه بگین دقیقا مشکلتون چیه شاید راه دیگری پیدا کردیم.

ho3ein.3ven
چهارشنبه 14 تیر 1391, 16:17 عصر
سلام
ببین من می خوام کلید اینتر رو به وب بروزر ارسال کنم . با دستور سند کیز اینتر به سیستم عامل ارسال میشه . چون برنامه من یه کار رو مرتبا تکرار می کنه اگر برنامه مینیمایز بشه کلید اینتر به برنامه ارسال نمیشه و دیگه برنامه کار نمی کنه . روش دیگری هم بود که اینتر به فرم ارسال میشد در این حالت هم روی وب بروزر هیچ تاثیری نداشت.حالا من یه روش می خوام که وقتی هم که برنامه مینیمایز باشه کلید اینتر به وب بروزر ارسال بشه .
با تشکر

just4froum
چهارشنبه 14 تیر 1391, 21:28 عصر
میتونم بپرسم چرا می خواین کلید اینتر رو به وب بروزر ارسال کنید ؟

ho3ein.3ven
چهارشنبه 14 تیر 1391, 23:06 عصر
ببین تو صفحه وب می خوام یک سری اطلاعات رو ثبت گنم و برای ثبت اون باید روی یک دکمه کلیک کنم که اون دکمه المنت نداره پس باید با کلید اینتر روی اوون دکمه کلیک کنم.

just4froum
پنج شنبه 15 تیر 1391, 00:10 صبح
برای ثبت اون باید روی یک دکمه کلیک کنم که اون دکمه المنت نداره پس باید با کلید اینتر روی اوون دکمه کلیک کنم.

چرا باید ؟؟؟:عصبانی::عصبانی::عصبانی:

برای تایید یک فرم الزاما نیازی ندارید روی دکمه تایید کلیک کنید.

بفرمایید :
web.Document.Forms(0).submit

بدین روش می تونید یک فرم رو تایید کنید.

ho3ein.3ven
پنج شنبه 15 تیر 1391, 00:35 صبح
داداش دست درد نکنه . من از خود شما تو همین تاپیک سوال کردم شما خودتون گفتین باید اینتر رو بفرستی منم دیگه...
حالا داداش تو این کد که گذاشتی جای 0 باید چی بزارم ؟

just4froum
پنج شنبه 15 تیر 1391, 01:00 صبح
من از خود شما تو همین تاپیک سوال کردم شما خودتون گفتین باید اینتر رو بفرستی منم دیگه...
حالا داداش تو این کد که گذاشتی جای 0 باید چی بزارم ؟

میشه بگید توی این تاپیک من کی یه همچین چیزی گفتم ؟

0 شماره فرمه و معمولا توی هر صفحه وب 1 فرم هست ولی اگر بیشتر بود به ترتیب اضافه میشه.

یعنی فرم 2 میشه 1 و فرم 3 میشه 2 و ...

ho3ein.3ven
پنج شنبه 15 تیر 1391, 08:39 صبح
داداش دستت درد نکنه . والا دقیق یادم نیست شما گفتی یا جناب واژدی گفتن به هر حال ممنون جواب داد

محسن واژدی
پنج شنبه 15 تیر 1391, 09:51 صبح
. . . من از خود شما تو همین تاپیک سوال کردم شما خودتون گفتین باید اینتر رو بفرستی منم دیگه...
.
.
.

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

سلام علیکم
واقعیتش بنده مطلبی به اینصورت عرض نکرده ام، شاید منظورتان پست #18 است:

سلام علیکم
برای کلیک و هر عمل دیگری بر روی اشیائی که id و name ندارند میتوانیم از indexشون استفاده کنیم، برای مثال اگر در web-browser به گوگل وارد شده و متنی را تایپ کنیم، برای فشردن دکمه جستجو (اگه id,name نداشته باشه نهایتا از index برای ارسال کلیک استفاده می کنیم):

Private Sub Form_Load()
WebBrowser1.Navigate "http://google.com"
End Sub

Private Sub Command1_Click()
WebBrowser1.Document.Forms(0).elements(6).Click
End Sub


موفق باشید

که در این مورد هم راه حل ارائه شده در مورد کلیک بر روی اشیائی است که id و name ندارند (مانند bottonها)، نه ارسال فرم

موفق باشید

ho3ein.3ven
پنج شنبه 15 تیر 1391, 10:31 صبح
سلام . آقا من از همگی معذرت می خوام . MohammadGh2011 ایشون در پست 10 گفتن . امیدوارم ایشون هم از دست من ناراحت نشن.
به هر حال ممنون از همگی

ho3ein.3ven
جمعه 16 تیر 1391, 11:03 صبح
سلام مجدد.
جناب واژدی کد هایی که در پست 29 قرار دادید برای بستن یک پیغام رو من روی پروژم گذاشتم و جواب داد ولی بعد از اینکه برنامه رو کامپایل کردم جواب نمیده مشکل از کجاست ؟

محسن واژدی
جمعه 16 تیر 1391, 12:00 عصر
سلام مجدد.
جناب واژدی کد هایی که در پست 29 قرار دادید برای بستن یک پیغام رو من روی پروژم گذاشتم و جواب داد ولی بعد از اینکه برنامه رو کامپایل کردم جواب نمیده مشکل از کجاست ؟

سلام علیکم
از اونجایی که تابع AutoCloseMessageTimer عنوان پنجره را جستجو میکند ممکنه عنوان پیام باز شده غیر از عنوانی باشه که در این تابع مشخص کرده ایم، چون به کدهاتون دسترسی ندارم نمیتوانم بهتر از این راهنمایی کنم!

موفق باشید

ho3ein.3ven
جمعه 16 تیر 1391, 13:23 عصر
سلام .ببین عنوان پنجره هیچ فرقی نمی کنه . چون برنامه وقتی که با خود وی بی اجرا می کنم هیچ مشکلی نداره ولی وقتی کامپایل می کنم پنجره بسته نمی شه.

محسن واژدی
جمعه 16 تیر 1391, 15:24 عصر
سلام علیکم
وقتی پیام را در زمان طراحی نمایش دهیم با برنامه کامپایل شده بسته نمیشه اما در زمانی که هردوتا برنامه کمپایل شده باشن بدون هیچ مشکلی پیام بسته میشه

موفق باشید

ho3ein.3ven
جمعه 16 تیر 1391, 17:17 عصر
ممنون از شما جواب گرفتم.
میگم راهی وجود داره برای چک کردن اینکه آیا وب لود شده یا نه ؟ این روشی که شما گفتین بعضی وقتا وب کامل لود شده ولی دستورات رو اجرا نمی کنه . توی برنامه من سرعت خیلی مهمه . روش دیگه ای وجود داره که مثلا چک کنه ببینه اگر فلان المنت توی وب لود شده باشه اونوقت دستورات رو اجرا کنه ؟

محسن واژدی
جمعه 16 تیر 1391, 23:04 عصر
راهی وجود داره برای چک کردن اینکه آیا وب لود شده یا نه ؟ پاسخ آقای قائم پناه: http://barnamenevis.org/showthread.php?348445&p=1536949&viewfull=1#post1536949
با این کد هم میتوانیم چک کنیم که آیا صفحه کاملا بار شده یا خیر (البته شاید در تایمر مناسب نباشه):

Private Sub Command1_Click()
If LCase(WebBrowser1.Document.Body.parentElement.inne rHTML) Like "*</body>" Then
MsgBox "Complete loaded...", vbInformation
End If
End Sub
روش دیگه ای وجود داره که مثلا چک کنه ببینه اگر فلان المنت توی وب لود شده باشه اونوقت دستورات رو اجرا کنه ؟ میتوانیم خصوصیاتی از عنصر مورد نظر به عنوان مثال نام را در صفحه بار شده چک کنیم

موفق باشید

ho3ein.3ven
شنبه 17 تیر 1391, 00:12 صبح
پاسخ آقای قائم پناه: http://barnamenevis.org/showthread.php?348445
با این کد هم میتوانیم چک کنیم که آیا صفحه کاملا بار شده یا خیر (البته شاید در تایمر مناسب نباشه):

Private Sub Command1_Click()
If LCase(WebBrowser1.Document.Body.parentElement.inne rHTML) Like "*</body>" Then
MsgBox "Complete loaded...", vbInformation
End If
End Sub میتوانیم خصوصیاتی از عنصر مورد نظر به عنوان مثال نام را در صفحه بار شده چک کنیم

موفق باشید

میشه در مورد این کد بیشتر توضیح بدین آخه ارور میده . ممنون

محسن واژدی
شنبه 17 تیر 1391, 08:10 صبح
سلام
کد را به این صورت زیر تغییر بدین:

Private Sub Command1_Click()
On Error Resume Next
If LCase(WebBrowser1.Document.Body.parentElement.inne rHTML) Like "*</body>" Then
If Err.Number = 0 Then MsgBox "Complete loaded...", vbInformation
End If
End Sub

البته راه دیگه هم استفاده از WebBrowser1.Busy است (اگر صفحه آماده باشد مقدار False در غیر اینصورت True را برمیگرداند (اما چون ممکن است برخی وقت ها تصویر و... بارگذاری شود دوباره مقدار برگشتی True میشود) )

موفق باشید

ho3ein.3ven
شنبه 17 تیر 1391, 10:44 صبح
سلام
کد را به این صورت زیر تغییر بدین:

Private Sub Command1_Click()
On Error Resume Next
If LCase(WebBrowser1.Document.Body.parentElement.inne rHTML) Like "*</body>" Then
If Err.Number = 0 Then MsgBox "Complete loaded...", vbInformation
End If
End Sub

البته راه دیگه هم استفاده از WebBrowser1.Busy است (اگر صفحه آماده باشد مقدار False در غیر اینصورت True را برمیگرداند (اما چون ممکن است برخی وقت ها تصویر و... بارگذاری شود دوباره مقدار برگشتی True میشود) )
موفق باشید

سلام واقعا ممنون از شما . ولی اینجوری که شما گفتی انجام دادم زیاد خوب نیود . کد هام رو به این صورت تغییر دادم :
Private Sub Timer2_Timer()
On Error Resume Next
w.Document.GetElementById("username").Value = "gdgdfgd"
w.Document.GetElementById("password").Value = "dsdal"
w.Document.GetElementById("submit").Click
If Err.Number = 0 Then
Timer2.Enabled = False
End If

End Sub
اینجوری جواب داد
ممنون از شما

just4froum
شنبه 17 تیر 1391, 13:01 عصر
سلام واقعا ممنون از شما . ولی اینجوری که شما گفتی انجام دادم زیاد خوب نیود . کد هام رو به این صورت تغییر دادم :
Private Sub Timer2_Timer()
On Error Resume Next
w.Document.GetElementById("username").Value = "gdgdfgd"
w.Document.GetElementById("password").Value = "dsdal"
w.Document.GetElementById("submit").Click
If Err.Number = 0 Then
Timer2.Enabled = False
End If

End Sub
اینجوری جواب داد
ممنون از شما

با سلام :

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

اگر اینتروال تایمرت کمتر از وقتی باشه که صفحه submit شده و شروع به بارگزاری دوباره کند صفحه توی یه loop می افته یعنی فرمو پر میکنه و فرم رو ارسال میکنه و قبل از این که فرم کامل ارسال شه و صفحه جدید بارگزاری شه دوباره فرم رو پر میکنه و ارسال میکنه که یهنی هیچ وقت ارسال نمیشه. ( امیدوارم فهمیده باشی )

ho3ein.3ven
شنبه 17 تیر 1391, 17:12 عصر
سلام دست درد نکنه راهنمایی کردی . چندین بار همین مشکلی که میگی برام پیش اومد . ولی در این مورد مشکل خاصی پیش نیومد چون وقتی که بدون ارور برنامه اجرا میشه تایمر غیر فعال میشه و دیگه دستورات رو اجرا نمی کنه . اینترول تایمر هم بر روی 1 .
بازم ممنون از اینکه راهنمایی کردی .

ho3ein.3ven
یک شنبه 18 تیر 1391, 12:43 عصر
سلام . دوستان کسی راهی برای مخفی کردن وب بروزر داره ؟ آخه وقتی وب بروزر visible=false قرار میگیره اصلا کار نمی کنه . و وقتی هم که اون رو خارج از محدوده فرم قرار میدم سرعتش خیلی پایین میاد . برنامه رو هم کامپیال کردم . حالا راهی به غیر از اینا سراغ داره که کاربر وب بروزر رو نبینه و سرعتش هم پایید نیاد ؟
با تشکر از همگی

محسن واژدی
یک شنبه 18 تیر 1391, 14:02 عصر
سلام . دوستان کسی راهی برای مخفی کردن وب بروزر داره ؟ آخه وقتی وب بروزر visible=false قرار میگیره اصلا کار نمی کنه . و وقتی هم که اون رو خارج از محدوده فرم قرار میدم سرعتش خیلی پایین میاد . برنامه رو هم کامپیال کردم . حالا راهی به غیر از اینا سراغ داره که کاربر وب بروزر رو نبینه و سرعتش هم پایید نیاد ؟
با تشکر از همگی
سلام علیکم
w,h,x,y را مطابق 0 قرار بدهیم
WebBrowser1.Move 0, 0, 0, 0

موفق باشید

just4froum
یک شنبه 18 تیر 1391, 14:12 عصر
سلام . دوستان کسی راهی برای مخفی کردن وب بروزر داره ؟ آخه وقتی وب بروزر visible=false قرار میگیره اصلا کار نمی کنه . و وقتی هم که اون رو خارج از محدوده فرم قرار میدم سرعتش خیلی پایین میاد . برنامه رو هم کامپیال کردم . حالا راهی به غیر از اینا سراغ داره که کاربر وب بروزر رو نبینه و سرعتش هم پایید نیاد ؟
با تشکر از همگی

با اجازه جناب واژدی :

روش دوم : می تونی یه پیکچر باکس بندازی روش و بردرشو برداری.