Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.20;
Скачать: CL | DM;

Вниз

Мастера! Помогите вывести текст из буфера обмена в АКТИВНОЕ приложение.   Найти похожие ветки 

 
greenrul ©   (2002-03-11 20:58) [0]

Пишу PostMessage(GetFocus(), WM_PASTE, 0, 0), не помогает, даже если GetForegroundWindow - в чем причина!? Буфер не пустой, а прога сидит в трее и при вылавливании "волшебной комбинации" это все выводит. В Notepad"e нажимаю "волшебную комбинацию", хренушки 8(


 
greenrul ©   (2002-03-12 14:59) [1]

PLEASE HELP!!!!


 
Alx2 ©   (2002-03-12 15:05) [2]

А точно GetFocus возвращает handle от edit control?


 
Alx2 ©   (2002-03-12 15:07) [3]

Вот это у меня сработало:
PostMessage(Edit1.Handle, WM_PASTE, 0, 0);
Сейчас попробую для чужого приложения...


 
Alx2 ©   (2002-03-12 15:15) [4]

Тоже получилось!
Ищем нужной окошко (в этом случае диалоговое окошко из Пуск->выполнить)
Function EnumWindowsProc(wHandle: HWND; LPARAM: Integer): BOOL; Stdcall;
Var TextLen: Integer;
S: String;
Begin
Result := True;
Case LPARAM Of
1:
Begin
TextLen := GetWindowTextLength(wHandle);
If TextLen > 0 Then
Begin
SetLength(S, TextLen + 1);
GetWindowText(wHandle, PChar(S), TextLen + 1);
S := PChar(S);
If Pos("ЗАПУСК ПРОГРАММЫ", AnsiUpperCase(S)) > 0 Then
With Form1.Memo1.Lines Do
Begin
Form1.wndHandle := wHandle;
Result := False;
End;
End;
End;
2:
Begin
SetLength(S, 20);
GetClassName(wHandle, PChar(S), 20);
S := PChar(S);
If S = "Edit" Then
Begin
Result := True;
Form1.wndField := wHandle;
End;
End;
End;
End;

Procedure TForm1.Button1Click(Sender: TObject);
Begin
EnumWindows(@EnumWindowsProc, 1);
wndHandle := -1;
wndField := -1;
If wndHandle > -1 Then
EnumChildWindows(wndJellyHandle, @EnumWindowsProc, 2)
if wndField>-1 then
PostMessage(wndField, WM_PASTE, 0, 0);
End;


 
Alx2 ©   (2002-03-12 15:18) [5]

Ой, вот это место не так :(
А вот так:

Procedure TForm1.Button1Click(Sender: TObject);
Begin
wndHandle := -1;
wndField := -1;
EnumWindows(@EnumWindowsProc, 1);
If wndHandle > -1 Then
EnumChildWindows(wndJellyHandle, @EnumWindowsProc, 2)
if wndField>-1 then
PostMessage(wndField, WM_PASTE, 0, 0);
End;




 
Alx2 ©   (2002-03-12 15:32) [6]

Блин, сорри за глюки. Проворонил ссылку на Memo. Она не нужна...


 
greenrul ©   (2002-03-12 16:03) [7]

А попроще нельзя 8)

почему у меня не вставляет в лругие программы? только в мою?


 
Alx2 ©   (2002-03-12 16:06) [8]

Видимо, ты неправильно указываешь handle дочернего окошка. Оно к тому же должно относится к категории edit controls.

А куда, ты хочешь вставлять текст? Подробнее плз...


 
greenrul ©   (2002-03-12 16:39) [9]

В Notepad тот-же.... только ТЕКСТА несколько строк


 
Alx2 ©   (2002-03-12 16:52) [10]

Проверил. Работает.

Function FindNotepadWindow(wHandle: HWND; LPARAM: Integer): BOOL; Stdcall;
Var TextLen: Integer;
S: String;
Begin
Result := True;
Case LPARAM Of
1:
Begin
SetLength(S, 20);
GetClassName(wHandle, PChar(S), 20);
S := PChar(S);
If Pos("NOTEPAD", UpperCase(S)) > 0 Then
Begin
Form1.wndNotePadHandle := wHandle;
Result := False;
End;
End;
2:
With Form1.Memo1.Lines Do
Begin
SetLength(S, 20);
GetClassName(wHandle, PChar(S), 20);
S := PChar(S);
If S = "Edit" Then
Begin
Result := False;
Form1.wndNotepadEdit := wHandle;
End;
End;
End;
End;

procedure TForm1.Button4Click(Sender: TObject);
begin
wndNotepadEdit := -1;
wndNotepadHandle := -1;
EnumWindows(@FindNotepadWindow, 1);
If wndNotepadHandle > -1 Then
EnumChildWindows(wndNotepadHandle, @FindNotepadWindow, 2);
if wndNotePadEdit>-1 then
PostMessage(wndNotePadEdit,WM_Paste,0,0);
end;


 
Alx2 ©   (2002-03-12 16:54) [11]

Блин, выкини только это: With Form1.Memo1.Lines Do
:)))


 
greenrul ©   (2002-03-12 19:38) [12]

Не, вы меня не поняли, БЛОКНОТ не причем - вставляться должно в ЛЮБУЮ программу, в которой сейчас работает полькователь - будь то Word, Notepad или 3DMAX


 
greenrul ©   (2002-03-12 23:20) [13]

Так можете помочь?


 
greenrul ©   (2002-03-12 23:54) [14]

Люди, помАгите пожалста - все 10 тем похожего содержания прочел, толку 0...

вот исходник -
MemoPaste.Lines.LoadFromFile(CurrentDir+"\"+Data[counter].name+".txt");
MemoPaste.SelectAll;
MemoPaste.CopyToClipboard;
SendMessage(GetForeGroundWindow,WM_PASTE,0,0);


В мою программу вставляется если вместо Get.... поставить GetFocus() но в ЛЮБОЙ другой (текстовый редактор, к примеру - хренушки)

Надесь на вас, мастера


 
Dimaond Cat ©   (2002-03-13 02:03) [15]

короче фигня такая, спользуя GetForeGroundWindow ты получаешь не тот хендл (конкретно ты получаешь хендл главного окна, а не окна редактора), и он не может обработать твое сообщение, но и не только в этом собака рылась, фишка в том , что к примеру word2000 вообще плюет на wm_past хотя exel2000 нормально срабатывает, если хочешь могу скинуть прогу которая делает то что тебе надо, пиши на мыло diamond_cat@newmail.ru подгоню пример


 
False_Delirium ©   (2002-03-13 04:28) [16]

Procedure SaveToCLip(S : string) ; - эта ф-ция сохраняет в ClipBoard текст
var P : Pointer ; HNDl : LongWord ; Len : Integer ;
begin
Len := Length(S) + 1 ;
OpenClipBoard(Hw) ;
HNDL := GlobalAlloc(GMEM_MOVEABLE,Len) ;
P := GlobalLock(HNDL) ;
Move(Pchar(S)^,P^,Len) ;
SetClipBoardData(CF_Text,HNDL) ;
CloseClipBoard ;
GlobalUnlock(HNDL) ;
GlobalFree(HNDL) ;
end ;

function GetFromClipBoard : String ; - берём из ClipBoard`а
var HNDl : THandle ;
begin
OpenClipBoard(HW) ; // Отрываем
HNDL := GetClipBoardData(cf_Text) ; // Берем handle данных(текстовых)
Result := PChar(GlobalLock(HNDL)) ; // берём данные по хендлу начиная с первога байта
GlobalUnlock(HNDL) ; // Высвобождаем
EmptyClipBoard ; // очищаем
CloseClipBoard ; // закрываем
end ;

procedure SetToAttached ;
var Wnd : LongWord ; St : String ;
begin
begin
Wnd := GetForeGroundWindow ;
AttachThreadInput(GetWindowThreadProcessID (Wnd,nil),GetCurrentThreadID,true) ; //подключаемся к активному приложению, для получения хендла активного контрола
SendMessage(GetFocus,$0301,0,0) ; //отправляем данные в буффер WM_Copy
St := GetFromClipBoard ; // получаем данные из буффера
... //нужные дейсвия с данными
SendMessage(GetFocus,$0302,0,0) ; //ложим обратно
AttachThreadInput(GetWindowThreadProcessID(Wnd,nil),GetCurrentThreadID,false) ; // отключаемся от потока
end ;


Но не желательно так делать... Лучше Использовать WM_CopyData ... принцип тот же...



 
False_Delirium ©   (2002-03-13 04:31) [17]

Забыл прокомментировать первую ф-цию...:)... Что-то же должны Вы сделать сами..:)))...

и перехват искл ситуаций тоже на вашей совести...


 
greenrul ©   (2002-03-14 00:36) [18]

А это для одной строки - а как быть с группой строк?
TMemo.Lines


 
False_Delirium ©   (2002-03-14 04:27) [19]

SaveToCLip(Memo1.Text).


 
greenrul ©   (2002-03-18 14:26) [20]

False_Delirium -> Может я тупой, но.... как вставить-то текст в работающее приложение?
SaveToCLipBoard(MemoPaste.Text);
SetToAttached;
????


 
greenrul ©   (2002-03-18 23:33) [21]

PLEASE HELP!?!?!


 
greenrul ©   (2002-03-20 14:53) [22]

Вот ответ на вопрос 8)
Wnd := GetForeGroundWindow ;
AttachThreadInput(GetWindowThreadProcessID (Wnd,nil),GetCurrentThreadID,true) ;
SendMessage(GetFocus,$0302,0,0) ;
MemoPaste.Clear;
MemoPaste.Lines.LoadFromFile(CurrentDir+"\"+Data[counter].name+".txt");
MemoPaste.SelectAll;
MemoPaste.CopyToClipboard;
AttachThreadInput(GetWindowThreadProcessID(Wnd,nil),GetCurrentThreadID,false) ;


без других процедур копируется содерание TMemo в буфер и вставляется в активное приложение...
Спасибо False_Derilium



Страницы: 1 вся ветка

Текущий архив: 2002.05.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
1-64696
Kekc
2002-05-04 22:04
2002.05.20
Сравнение TBitmap


14-64830
Besa
2002-04-10 17:36
2002.05.20
По сводкам СОВИНФОРМБЮРО...


14-64822
DeMoN-777
2002-04-11 04:16
2002.05.20
Как узнать на каком языке писалась программа ?


14-64833
Oleh
2002-04-12 11:37
2002.05.20
Динамическиє собития


1-64706
dzmitry
2002-05-02 12:53
2002.05.20
TListView