PDA

View Full Version : جستجوی یک کلمه در پنجره ای دیگر



ssmehizadeh
یک شنبه 17 مهر 1384, 08:02 صبح
با سلام

من به یه مشکل برخورد کردم ....

handle یک پنجره مثل notepad رو بدست می آرم حالا می خوام با برنامه توی notepad دنبال یک کلمه بگردم .....

مثلا یک تابه api داریم که ورودی اون یه handle و کلمه مورد جستجوی ما باشه و اگه اون کلمه رو توی اون پنجره پیدا کرد یه مقدار رو به ما برگردونه ..........

vcldeveloper
دوشنبه 18 مهر 1384, 03:33 صبح
من API ایی ندیدم که خودش این کار رو انجام بده، اما شما می تونید متن موجود در Notepad رو با استفاده از پیغام WM_GETTEXT بگیری و خودت توش جستجو انجام بدی:


function FindTextInNotepad(Text : string) : integer;
var
hNotepad,
hEdit : THandle;
TextLength : integer;
Buffer : string;
begin
Result := 0;
//Find Notepad window handle
hNotepad := FindWindow('Notepad',nil);
if hNotepad > 0 then
begin
//Find Notepad's Edit control's handle
hEdit := FindWindowEx(hNotepad,0,'Edit',nil);
if hEdit > 0 then
begin
//Get length of the text in Notepad
TextLength := SendMessage(hEdit, WM_GETTEXTLENGTH, 0,0);
//Allocate enough space in memory for the text to be retrieved
SetLength(Buffer,TextLength + 1);
//Get the text from Edit control in Notepad window
SendMessage(hEdit, WM_GETTEXT, TextLength,Integer(Pointer(Buffer)));
Buffer := Trim(Buffer);
//Look for the specified text and return its positon in buffer
Result := Pos(Text,Buffer);
end;
end
else
raise Exception.Create('Notepad is not running');
end;

ssmehizadeh
جمعه 22 مهر 1384, 08:42 صبح
سلام


اقای کشاورز از راهنمایی شما ممنونم .... برنامه بالا در notepad کار میکنه اما من می خوام در internet explorer یک کلمه خاص رو جستجو کنم ( البته در بالا گفتم ....... مثل notepad ........... ) برای این کار از تابع findwindow به صورت زیر استفاده کردم :
FindWindow('IEframe',nil);
ولی فکر کنم علاوه بر تابع بالا باید دستور زیر هم تغییر کنه :
FindWindowEx(hNotepad,0,'edit',nil)
این دستور برای چیه و بجای کلمه edit باید از چی استفاده کنم ........

با تشکر

ssmehizadeh
شنبه 23 مهر 1384, 19:33 عصر
آقا یکی کمکم کنه ......... فقط یه راهنمایی

vcldeveloper
یک شنبه 24 مهر 1384, 04:23 صبح
برای IE باید مسیر IEFrame -> Shell DocObject View -> Internet Explorer_Server را بجای NotePad -> Edit طی می کردید، اما با کد بالا و پیغام WM_GETMESSAGE نمیشه متن داخل کنترل Internet Explorer_Server را بدست آورد.
باید از Automation استفاده کنید:
در کد زیر متن مورد جستجو در متغیر SearchStr و متن موجود در IE در متغیر Text ذخیره میشه. ShellWindows.Count تعداد پنجره های باز متعلق به Shell را بر می گردونه (یعنی پنجره های IE و Windows Explorer). در کد زیر متن تمام این پنجره ها چک میشه (در حلقه for). اگه فقط به یک پنجره نیاز دارید، می تونید با استفاده از خصوصیت Item از شی ShellWindows به هر یک از اونها دسترسی داشته باشید. برای هر یک از پنجره ها می تونید عنوان سند یا URL یا هندل اون پنجره را بررسی کنید و در صورتی که پنجره مورد نظر شما بود، متن آن را دریافت کنید.


uses SHDocVw_TLB, MSHTML_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
ShellWindows: Ishellwindows;
WebBrowser: IWebbrowser2;
Doc : IHTMLDocument2;
Body : IHtmlElement;
Text,
SearchStr : WideString;
i : integer;
begin
SearchStr := 'Search String';
ShellWindows := CoShellWindows.Create;
for i := 0 to ShellWindows.Count-1 do
begin
WebBrowser := ShellWindows.Item(i) as IWebbrowser2;
if WebBrowser <> nil then
begin
Doc := WebBrowser.Document as IHTMLDocument2;
Body := Doc.body as IHtmlElement;
Text := Body.innerText;
if Pos(SearchStr,Text) > 0 then
//if the searchStr is found then do something
end;
end;
end;

یونیت های SHDocVw_TLB, MSHTML_TLB در واقع Type Library های Microsoft HTML Object Library و Microsoft Internet Controls هستند که می تونید اونها رو با استفاده از گزینه Import Type Library از منوی Project ایجاد کنید. دقت کنید که فایل MSHTML_TLB حدود 11.7 مگ حجم داره و Import اش یا باز کردنش در IDE طول میکشه.

ssmehizadeh
دوشنبه 25 مهر 1384, 06:06 صبح
انشاءالله که مشکلم حل میشه ...........

از کمکتون ممنونم آقای کشاورز

ssmehizadeh
جمعه 29 مهر 1384, 09:31 صبح
آقا خیلی ممنون عالی بود .......

موفق باشین