سلام
اگر چندین صفحه سایت با آدرس های متفاوت توسط اینترنت اکسپلورر باز شده باشد چگونه می توانم آدرس صفحه ای که Focus شده است را به دست آورم؟
Printable View
سلام
اگر چندین صفحه سایت با آدرس های متفاوت توسط اینترنت اکسپلورر باز شده باشد چگونه می توانم آدرس صفحه ای که Focus شده است را به دست آورم؟
سلام
اول یک مطلب رو روشن کنم چون برنامه نویسان VB اغلب نمیدوند (البته با اجازه اساتید)
ویندوز به همه چهار چوب ها به چشم یک پنجره نگاه میکنه و یک اشاره گر پنجره با نام hWnd به اونا اختصاص میده در نتیجه یک TextBox یا یک دکمه یا هر کنترلر دیگری از نظر ویندوز یک پنجره است. در نتیجه در جملات زیر وقتی میگم پنجره منظورم هر چهارچوبی است که ویندوز اونو به عنوان پنجره قبول داره. (اصلاَ نام ویندوز از اینجا آمده "سیستم عامل پنجره ها")
شاید دوستان راه بهتری بلد باشن ولی چیزی که به ذهن من میرسه اینه.
یک API داریم که پنجره Focus شده را برمیگردونه!
یک API هم داریم که پنجره های Child یک پنجره را بر میگردونه.
یک API هم داریم خصوصیت Text یک پنجره را برمیگردونه.
با تلفیق این سه API و به شرط فعال بودن AddressBar و با کمی زحمت میشه همچین کاری کرد.
با API اولی پنجره IE فعال رو پیدا میکنی
با API دومی TextBox مربوط به AddressBar را پیدا میکنی و
با API سومی متن داخل اون TextBox را پیدا میکنی.
الآن حضور ذهن ندارم ولی تا فردا این سه تا API را همراه با چندتا دیگه در همین جا برات میزارم. (البته بازم میگم کمی زحمت داره)
حالا شاید هم تا فردا کسی که سوادش از ما بیشتر بود، عشقش کشید و یک راه راحت تر ارائه داد.
دست شما درد نكند دوست عزيز
من اين سئوال را از سايت برنامه نويس چند وقت پيش پرسيده بودم ولي به جوابي نرسيدم ممنون ميشم جواب دهيد
مي توني از سورس برنامه زير استفاده كني :
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ممنون Romina2006
حالا بايد چي كار كنم كه بدون اينكه موس را روي آدرس بار ببرم متن داخل اونا بدست آورم ؟
به نظرم بايد يك حلقه For از يك تا تعداد اشيا موجود در IE ايجاد كرد و اگر به شي Address Bar رسيد آنگاه متن داخل اونا بده اما چجوري نمي دونم
خواهشا اگر كسي چيزي در اين مورد مي دونه لطفا راهنمايي كنه
سلام
من هنوز نگاهی به کدهایی که دوستان گذاشتن ننداخته ام
ولی اینم API هایی که گفته بودم. بنظر نامشان گویای کارشان است و نیازی به توضیح ندارند.
ولی این API فرمت VB8 هستند اگر احتمالاَ، شاید خواستید در VB6 در پیت استفاده شان کنید باید
اولاَ کلمات Unicode را حذف کنید(این VB6 هیچی نو زندگیش نوفهمه!)
دوماَ تمام توابعی که به Wبزرگ ختم میشوند را به Aبزرگ تغییر دهید.
سوماَ تمام Integer ها را به Long تغییر دهید.
کد:
Private Declare Unicode Function FindWindowW Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Unicode Function FindWindowExW Lib "user32" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpszClass As String, ByVal lpszWindow As String) As Integer
Private Declare Unicode Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Integer, ByVal wFlag As Integer) AsInteger
Private Declare Unicode Function GetTopWindow Lib "user32" (ByVal hwnd As Integer) As Integer
Private Declare Unicode Function GetFocus Lib "user32"Alias"GetFocus" () As Integer
Private Declare Unicode Function GetActiveWindow Lib "user32" () As Integer
Private Declare Unicode Function GetWindowTextW Lib "user32" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
Private Declare Unicode Function GetWindowTextLengthW Lib "user32" (ByVal hwnd As Integer) As Integer
Private Declare Unicode Function GetClassNameW Lib "user32" (ByVal hWnd As Integer, ByVal Buffer As String, ByVal nMaxCount As Integer) As Integer
Private Declare Unicode Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Integer, ByVal wCmd As API_GW) As Integer
Public Enum API_GW As Integer
GW_OWNER = 4
GW_MAX = 5
GW_HWNDPREV = 3
GW_HWNDNEXT = 2
GW_HWNDLAST = 1
GW_HWNDFIRST = 0
GW_CHILD = 5
End Enum
من عکسی (4برابر واقعی) از Vista-IE7 تهیه کرده ام که امیدوارم در فهم مسئله کمک کنید
هر پنجره ای یک نام کلاس دارد که از روی آن هم میتوانی پنجره را پیدا کنی.
مثلاَ در ویستا هفت سطح تودرتویی وجود دارد تا به TextBox اصلی برسی یعنی اول باید پنجره فعال با نام کلاس IEFrame را پیدا کنی، بعد در بین فرزندان یا اعضای IEFrame دنبال WorkerW بگردی و الی آخر. (البته امکان دارد نام این کلاسها در XP فرق داشته باشند)
راستی اگر خواستی با VB8 کارکنی، من یک DLL با یک ماژول با نام NativeWindow دارم که کار را بسیار، بسیار راحت میکند، حتی اگر خواستی شاید بتوانم کل کدی را که خواستی با استفاده از NativeWindow برایت بفرستم.
راستی توضیحات این DLL
یا
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
کد:Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) 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 Declare Function SendMessageByString 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_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Sub GetURLstring_Click()
On Error GoTo CallErrorA
Dim buffer As String, TextLength As Long, sClassName As String
Dim lhwnd As Long, WindowHandle As Long
lhwnd = 0
sClassName = ("IEFrame")
lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString)
sClassName = ("WorkerW")
lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString)
sClassName = ("ReBarWindow32")
lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString)
sClassName = ("ComboBoxEx32")
lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString)
sClassName = ("ComboBox")
lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString)
sClassName = ("Edit")
lhwnd = FindWindowEx(lhwnd, 0, sClassName, vbNullString)
WindowHandle& = lhwnd
TextLength& = SendMessage(WindowHandle&, WM_GETTEXTLENGTH, 0&, 0&)
buffer$ = String(TextLength&, 0&)
Call SendMessageByString(WindowHandle&, WM_GETTEXT, TextLength& + 1, buffer$)
MsgBox buffer$
Exit Sub
CallErrorA:
MsgBox Err.Description
Err.Clear
End Sub