PDA

View Full Version : سوال: چطور میتونم متن انتخاب شده در یه کادر متن از برنامه دیگه رو توی برنامم به دست بیارم؟



mbshareat
پنج شنبه 02 شهریور 1391, 13:41 عصر
من یه برنامه دیکشنری اختصاصی خودم رو دارم که میخوام تنها واژه هایی که به دردم میخوره با معنای مختصر و گزینش شده توش داشته باشم.
یه برنامه دیکشنری هست به نام Z Dictionary که می خوام کلمه و قسمت انتخاب شده از معناش رو از توی اون به برنامم بیارم.
در گرفتن خود کلمه انگلیسی مشکلی ندارم اما برای بدست اوردن قسمت Select شده از معنا مشکل دارم.
من یه Hot Key تعریف کردم که با فشار مثلا Ctrl+Q فشار Ctrl+C رو که برای کپی به کار میره شبیه سازی کنم اما چیزی به کلیپ برد فرستاده نمیشه که من بتونم از کلیپ برد بردارم.
این هم کدی که نوشتم.
اگه راه سر راست تر از شبیه سازی فشار Ctrl+C هم هست لطفا بفرمایید.
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
Procedure WMHotkey( Var msg: TWMHotkey ) ;message WM_HOTKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotkey
(Handle, 1, MOD_Control , Ord('Q'));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotkey( Handle, 1 ) ;
end;
Procedure TForm1.WMHotkey( Var msg: TWMHotkey ) ;
Var
FormHand,WordEditHand,TranslateEditHand:THandle;
Txt: array[0..255] of char;
begin
FormHand:= FindWindow(nil, 'ZDic ÝÑåä áÛÊ ÇäáíÓì');
If FormHand=0 Then
Exit;
WordEditHand := FindWindowEx(FormHand, 0, 'Edit', nil);
TranslateEditHand := FindWindowEx(FormHand, WordEditHand, 'Edit', nil);
SendMessage(WordEditHand,WM_GETTEXT,256,Integer(@T xt));
Edit1.Text:=Txt;
SetActiveWindow(TranslateEditHand);
keybd_event(VK_Control, 0, 0, 0);
Application.ProcessMessages;
PostMessage(FormHand,WM_KeyDown,Ord('C'),0);
Application.ProcessMessages;
PostMessage(FormHand,WM_KeyUp,Ord('C'),0);
Application.ProcessMessages;
keybd_event(VK_Control, 0,KEYEVENTF_KEYUP, 0);
Application.ProcessMessages;
Edit2.Text:=ClipBoard.AsText;
end;

end.

mbshareat
پنج شنبه 02 شهریور 1391, 20:31 عصر
سلام و عرض ادب و احترام خدمت دوستان
من هر کدوم از دو تکه کد زیر رو به کار می برم عمل Ctrl+C شبیه سازی میشه اما دیر انجام میشه و تو برنامه بازتاب نداره.
یعنی اون تکه متن انتخاب شده از معنای کلمه رو تو حافظه دارم و می تونم بعد از فشار Hot Key تعریف شده خودم با Ctrl+V الصاق کنم؛ اما من می خوام برنامه الصاق کنه:

// Simulate a key up
keybd_event( VK_CONTROL,$45,
KEYEVENTF_EXTENDEDKEY or 0,0 );
keybd_event( Ord('C'),$45,
KEYEVENTF_EXTENDEDKEY or 0,0 );
// Simulate a key up
keybd_event( VK_CONTROL,$45,
KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
keybd_event( Ord('C'),$45,
KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
Application.ProcessMessages;


و این یکی :

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0);
keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
Application.ProcessMessages;

mbshareat
جمعه 03 شهریور 1391, 12:22 عصر
سلام
مساله حل شد اما هنوز نمی فهمم چرا اینجوریه.
عمل الصاق رو گذاشتم تو یه پروسیجر جدا و بعد از دستوراتی که ذکر کرده فراخوانی کردم الصاق انجام شد.
یعنی دستور زیر رو گذاشتم تو پروسیجر مشکل حل شد در حالی که اگه مستقیما در ادامه کد اجراش می کردم کار نمی کرد:
DicList.ValueEdit.PasteFromClipboard;
متوجه نمیشم چرا Application.ProcessMessages; کافی نبود؟
یه چیز دیگه هم فهمیدم اگه DicList.ValueEdit.Text:=ClipBoard.AsText; اجرا کنم فارسی به علامت سوال تبدیل میشه!