ورود

View Full Version : سوال: بدست آوردن صفحه ی فعلی مرورگر های ویندوز با دلفی



sajioo
چهارشنبه 17 آبان 1391, 14:26 عصر
عزیزان سوالم رو اینطور مطرح کنم که فرض کنید کاربر 3 مرورگر (فایرفاکس - کروم - اکسپلورر ) بر روی سیستمش نصب داره. ما نمی دونیم از کدوم مرورگر در حال استفاده است من فقط می خوام بدونم صفحه ی وبی که در اون لحظه کاربر در حال مشاهده اش است آدرسش چیه؟
دوستان فرض کنید که مثلا صفحه ی ایمیل کاربر با مرورگر کروم بازه و به صورت مینیمایز هستش. اما در همین حین کاربر داره با مرورگر موزیلا صفحه ی از سایت برنامه نویس:قلب: رو مشاهده می کنه . می خوام ببینم برنامه چطور آدرس سایت برنامه نویس:قلب: رو متوجه بشه؟

Felony
چهارشنبه 17 آبان 1391, 14:51 عصر
پس به عبارتی میخواین آدرس مربوط به Address Bar مرورگر فعال رو به دست بیارید ، با این اوصاف اول با استفاده از تابع GetForegroundWindow هندل پنجره فعال رو به دست بیارید ، بعد با استفاده از FindWindowEX شروع به پیدا کردن پنجره Address Bar کنید و در آخر هم با تابع GetWindowText متنش رو ازش بخونید ، مشکلی که در این بین باهاش مواجه میشی این هست که اسم کلاس ها و ترتیب اون ها برای رسیدن به Address Bar مرورگر متفاوت هست ، برای این کار بعد از گرفتن هندل پنجره فعال با شرط بررسی کنید ببینید FindWindoEX برای کدوم کلاس هندل معتبر بر میگردونه ، هر کلاسی که هندل معتبری برگردوند یعنی مرورگر مربوط به اون فعاله و میتونید نسبت به اون مرورگر شروع کن به پیدا کردن هندل Adress Bar .

در آخر تو هر نسخه ای از این مرورگرها ممکنه نام کلاس ها و ... تغییر کنه و برنامه شما از کار بیافته ، اگر دنبال کار و درست و حسابی هست باید از یک Device Driver استفاده کنی ( مثلا WinPcap ) و آدرس هایی که مشاهده میشه رو زیر نظر داشته باشی .

sajioo
پنج شنبه 18 آبان 1391, 14:32 عصر
آقا ماهان عزیز حرف شما درست است .
من کمی جستجو که کردم به این کد دست پیدا کردم

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
procedure FindIEEditHandle;
{ Public declarations }
end;

var
Form1: TForm1;
EditHandle: THandle;
implementation

{$R *.dfm}
function EnumIEChildProc(AHandle: hWnd; AnObject: TObject): BOOL; stdcall;
var
tmpS : string;
theClassName : string;
theWinText : string;
begin
Result := True;
SetLength(theClassName, 256);
GetClassName(AHandle, PChar(theClassName), 255);
SetLength(theWinText, 256);
GetWindowText(AHandle, PChar(theWinText), 255);
tmpS := StrPas(PChar(theClassName));
if theWinText <> EmptyStr then
tmpS := tmpS + ' "'
+ StrPas(PChar(theWinText)) + '"'
else
tmpS := tmpS + '""';
if Pos('Edit', tmpS) > 0 then
begin
EditHandle := AHandle;
end;
end;

function IEWindowEnumProc(AHandle: hWnd; AnObject: TObject): BOOL; stdcall;
// callback for EnumWindows.
var
theClassName: string;
theWinText: string;
tmpS: string;
begin
Result := True;
SetLength(theClassName, 256);
GetClassName(AHandle, PChar(theClassName), 255);
SetLength(theWinText, 256);
GetWindowText(AHandle, PChar(theWinText), 255);
tmpS := StrPas(PChar(theClassName));
if theWinText <> EmptyStr then
tmpS := tmpS + ' "'
+ StrPas(PChar(theWinText)) + '"'
else
tmpS := tmpS + '""';
if Pos('IEFrame', tmpS) > 0 then
begin
EnumChildWindows(AHandle, @EnumIEChildProc, longInt(0));
end;
end;

procedure TForm1.FindIEEditHandle;
begin
Screen.Cursor := crHourGlass;
try
EnumWindows(@IEWindowEnumProc, LongInt(0));
finally
Screen.Cursor := crDefault;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
caption: Array [0..127] of Char;
s: String;
begin
FindIEEditHandle;
if EditHandle > 0 then
begin
SendMessage(EditHandle, WM_GETTEXT, Sizeof( caption ), integer(@caption));
s := Caption;
s := StringReplace(s, '&', '&&' , [rfReplaceAll, rfIgnoreCase]);
Label1.Caption := s;
end
else
label1.Caption := 'Not Found';
end;


end.


آقا ماهان این روی ie درست کار میده.
لطفا اگه از TDDEClientConv اطلاعات دارید در اختیار من بذارید چون چند جا بهش بر خوردم

sajioo
پنج شنبه 18 آبان 1391, 15:09 عصر
پس به عبارتی میخواین آدرس مربوط به Address Bar مرورگر فعال رو به دست بیارید ، با این اوصاف اول با استفاده از تابع GetForegroundWindow هندل پنجره فعال رو به دست بیارید ،
آقا ماهان میشه بگید چطور میشه فهمید که هندل مورد نظر مربوط به کدام مرورگر یا برنامه است.
اگه بخوام توضیح بیشتر بدم منظورم اینه که فرض کنید ما هندل یک برنامه رو گرفتیم . از کجا بفهمم این هندل مربوط به یک مرورگر فایرفاکس یا کروم یا .... ؟
میشه یک راهنمایی کنید؟

Felony
پنج شنبه 18 آبان 1391, 17:13 عصر
میتونید از تابع GetWindowModuleFileName استفاده کنید که هندل یک پنجره رو میگیره و نام فایل اجرایی مربوطه رو بر میگیردونه ، البته این تابع اکثر موارد با خودش درگیره و درست کار نمیکنه ( درکل مطمئن عمل نمیکنه )

به جای اون تابع زیر رو نوشتم ، رو چند تا برنامه هم تست کردم مشکلی نداشت ، اول باید تابع QueryFullProcessImageName (http://www.google.com/url?sa=t&rct=j&q=queryfullprocessimagename&source=web&cd=1&ved=0CDAQFjAA&url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fwindows%2Fdesktop%2Fms684919(v%3Dvs .85).aspx&ei=w76bUPjPOoTXsgbSkYGYDA&usg=AFQjCNEFR0f68lfinkojFrxABVgGPti5Nw&cad=rja)رو به برنامه Import کنید :

function QueryFullProcessImageName(hProcess: THandle; dwFlags: DWORD;
lpExeName: PChar; nSize: PDWORD): BOOL; stdcall;
external kernel32 name 'QueryFullProcessImageName' +
{$IFDEF UNICODE} 'W' {$ELSE} 'A' {$ENDIF};

این هم تابع :

function GetActiveWindowExeName: string;
var
FileName: array [0 .. 255] of char;
FileNameLength: Cardinal;
WindowHandle, ProceeeHandle: THandle;
ProcessID, ThreadID: DWORD;
begin
WindowHandle := GetForegroundWindow;
ThreadID := GetWindowThreadProcessId(WindowHandle, ProcessID);

ProceeeHandle := OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ProcessID);
FileNameLength := MAX_PATH;
if Boolean(ProceeeHandle) and (QueryFullProcessImageName(ProceeeHandle, 0,
FileName, @FileNameLength)) then
Result := FileName;
end;

البته همونطور که تو اون لینک MSDN مربوط به تابع QueryFullProcessImageName توضیح داده شده این تابع از ویندوز ویستا به بعد اضافه شده و رو نسخه های قبلی ویندوز کار نمیکنه ، اگر برنامتون قراره رو نسخه های قدیمتر ویندوز مثل XP هم اجرا بشه میشه این مورد رو با تابع EnumProcesses هم پیادش کرد که الان وقتش رو ندارم نمونه بنویسم ، این لینک هم یه کارایی کرده ولی من نخوندم ببینم چی نوشته و به درد میخوره یا نه :

http://swissdelphicenter.ch/en/showcode.php?id=2010

این لینک هم با EnumProcess پیداش کرده ، البته با ++C ، خودت میتونی به Delphi ترجمش کنی :

http://www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle

mehdi_moosavi
دوشنبه 05 خرداد 1393, 10:08 صبح
با درود بدوستان محترم
من كدي كه دوستمون sajioo در اينجا براي بدست آوردن آدرس در اينترنت اكسپلورر گذاشتن رو ديدم. آيا امكان داره اين كد طوري تغيير داده بشه تا براي مرورگر كروم هم قابل استفاده باشه؟
يعني وقتي مرورگر كروم بازه و يك سايت رو نمايش داده آدرس اون سايت رو از آدرس بار بگيرم.
من google و findwindowex رو جستجو كردم. البته مطالب زيادي مطرح شده و خيلي هم براي من آموزنده بود ولي نتونستم به جوابم برسم كد هاي ارائه شده كپشن ويندوز كروم رو برميگردونه ولي من احتياج به آدرس در آدرس بار دارم.
يك مورد ديگه هم كلاس اون قسمتي هست كه در برنامه كروم آدرس رو وارد ميكنيم. آيا Edit هست يا ComboBox?
دوستان محترم لطفا راهنمايي كنيد
باتشكر