View Full Version : تایپ در نرم افزاری دیگر
adib_f
دوشنبه 10 فروردین 1388, 20:26 عصر
با سلام
من تازه کارم ( به قول خودمونی noob :D)
1 سوال داشتم
من میخوام در یک نرم افزار دیگر به عنوان مثال Notepad یا نرم افزاری که یک فیلد برای نوشتن دارد
متنی را کپی کنم(یعنی دراونجا قرار بدم)
چند جا رو گشتم و چند مقاله ی نا مربوط دیدم و به دردم نخورد
اگر دوستان کمک کنن واقعا ممنون میشم چون خیلی بهش نیاز دارم
__ممنون__
lord_viper
دوشنبه 10 فروردین 1388, 22:33 عصر
شما باید با استفاده از توابع api مثل findwindow و findwindowEX هندل اون edit رو به دست بیارین و با استفاده از SendMessage و wm_charمتن خودتونو به اون ارسال کنین
adib_f
سه شنبه 11 فروردین 1388, 09:18 صبح
سلام
خیلی ممنون از راهنماییتون
از اونجایی که من تازه کارم یه سرچ گوگل با کلمات شما کردم
چند تا صفحه ی مرتبط پیدا شد
یکیش :
http://www.swissdelphicenter.ch/torry/showcode.php?id=327
و یک مثالش:
{
Example to search for Edit field nr. x in another application and send a text to it
Beispiel, wie man nach dem X. Feld in einer anderen Applikation sucht
und ein Text schickt.
}
function FindControlByNumber(hApp: HWND; ControlClassName: string; ControlNr: Word = 1): HWND;
var
i: Word;
hControl: HWND;
begin
Result := 0;
if IsWindow(hApp) then
begin
Dec(ControlNr);
hControl := 0;
for i := 0 to ControlNr do
begin
hControl := FindWindowEx(hApp, hControl, PChar(ControlClassName), nil);
if hControl = 0 then
Exit;
end;
end;
Result := hControl;
end;
procedure SetEditText(hApp: HWND; EditClassName, AText: string; EditNr: Integer);
var
hEdit: HWND;
begin
// Search for the 2. Edit Field in a application
hEdit := FindControlByNumber(FindWindow('Write_Here_Class_O f_App', nil), 'Edit', 2);
if hEdit <> 0 then
// Test: Send a "Hello" to the Edit Field
SendMessage(hEdit, WM_SETTEXT, 0, Integer(PChar('Hello')));
end;
ولی من نمیدونم چه طوری استفاده کنم
من مثلا میخوام با فشردن دکمه این تابع عمل کنه
ممنون
adib_f
سه شنبه 11 فروردین 1388, 09:27 صبح
خب من مشکلم یه ذره حل شد
procedure TForm1.Button1Click(Sender: TObject);
var
wnd: HWND;
i: Integer;
s: string;
begin
wnd := FindWindow('notepad', nil);
if wnd <> 0 then
begin
wnd := FindWindowEx(wnd, 0, 'Edit', nil);
// Write Text in Notepad.
// Text ins Notepad schreiben.
s := 'Hello';
for i := 1 to Length(s) do
SendMessage(wnd, WM_CHAR, Word(s), 0);
[I]// Simulate Return Key.
PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
// Simulate Space.
PostMessage(wnd, WM_KEYDOWN, VK_SPACE, 0);
end;
end;
الان ی مشکل دیگه دارم
اون نرم افزاری که من میخوام کلمه بفرستم داخلش 2 تا جا داره
یکی در پایینه که ادیت هست و میشه درش تایپ کرد
و یکی در بالا هست که یه چیزایی رو نشون میده(عین یاهو که در پایی مینویسی در بالا نشون میده)
این کار انجام پذیر هست که من یه چیزی به داخلش بفرستم و بعدش نرم افزار کلید اینتر رو فشار بده؟
ممنون
lord_viper
سه شنبه 11 فروردین 1388, 11:53 صبح
بله شما کافیه کد کلید inter رو با همون sendmessage بهش ارسال کنید
adib_f
سه شنبه 11 فروردین 1388, 12:14 عصر
الان مشکل جدیدی دارم :دی
من هر کاری میکنم نمیدونم classname اون فیلدی ه قراره توش نوشته بشه چیه
EditوRICHTEXt رو امتحانکردم نشد
خود wndow انتخاب میشه(هندلش به دست میاد) ولی هندل اون فیلد رو نمیتونم به دست بیارم
اینم کدمه :
procedure TForm4.Button1Click(Sender: TObject);
var
wnd1,wnd: HWND;
i,classn: Integer;
s: string;
begin
wnd1 := FindWindow('ChatSkinWnd', '[DF]S.N.A.K.Y - Chat Window');
if wnd1 <> 0 then
begin
wnd := FindWindowEx(wnd1,0,'RICHEDIT','[DF]S.N.A.K.Y - Chat Window');
if wnd <> 0 then
begin
Edit1.Text := 'ADIB!';
// Write Text in Notepad.
// Text ins Notepad schreiben.
s := 'Hello';
for i := 1 to Length(s) do
begin
SendMessage( wnd, WM_CHAR, Word(s[i]), 0);
// Simulate Return Key.
// PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
// Simulate Space.
// PostMessage(wnd, WM_KEYDOWN, VK_SPACE, 0);
// Edit1.Text := 'ADIB!';
end;
end;
end;
end;
lord_viper
پنج شنبه 13 فروردین 1388, 08:36 صبح
از تابع api زیر برای پیدا کردن کلاس استفاده کنید
int GetClassName(
HWND hWnd, // handle of window
LPTSTR lpClassName, // address of buffer for class name
int nMaxCount // size of buffer, in characters
);
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.