![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мастера! Помогите вывести текст из буфера обмена в АКТИВНОЕ приложение. [D5]
greenrul © (2002-03-11 20:58:00)Пишу PostMessage(GetFocus(), WM_PASTE, 0, 0), не помогает, даже если GetForegroundWindow - в чем причина!? Буфер не пустой, а прога сидит в трее и при вылавливании "волшебной комбинации" это все выводит. В Notepad"e нажимаю "волшебную комбинацию", хренушки 8(
greenrul (2002-03-20 14:53:00) [1]Вот ответ на вопрос 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
greenrul (2002-03-18 23:33:00) [2]PLEASE HELP!?!?!
greenrul (2002-03-18 14:26:00) [3]False_Delirium-> Может я тупой, но.... как вставить-то текст в работающее приложение?
SaveToCLipBoard(MemoPaste.Text);
SetToAttached;
????
False_Delirium (2002-03-14 04:27:00) [4]SaveToCLip(Memo1.Text).
greenrul (2002-03-14 00:36:00) [5]А это для одной строки - а как быть с группой строк?
TMemo.Lines
False_Delirium (2002-03-13 04:31:00) [6]Забыл прокомментировать первую ф-цию...:)... Что-то же должны Вы сделать сами..:)))...
и перехват искл ситуаций тоже на вашей совести...
False_Delirium (2002-03-13 04:28:00) [7]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 ... принцип тот же...
Dimaond Cat (2002-03-13 02:03:00) [8]короче фигня такая, спользуя GetForeGroundWindow ты получаешь не тот хендл (конкретно ты получаешь хендл главного окна, а не окна редактора), и он не может обработать твое сообщение, но и не только в этом собака рылась, фишка в том , что к примеру word2000 вообще плюет на wm_past хотя exel2000 нормально срабатывает, если хочешь могу скинуть прогу которая делает то что тебе надо, пиши на мыло diamond_cat@newmail.ru подгоню пример
greenrul (2002-03-12 23:54:00) [9]Люди, помАгите пожалста - все 10 тем похожего содержания прочел, толку 0...
вот исходник -
MemoPaste.Lines.LoadFromFile(CurrentDir+"\"+Data[counter].name+".txt");
MemoPaste.SelectAll;
MemoPaste.CopyToClipboard;
SendMessage(GetForeGroundWindow,WM_PASTE,0,0);
В мою программу вставляется если вместо Get.... поставить GetFocus() но в ЛЮБОЙ другой (текстовый редактор, к примеру - хренушки)
Надесь на вас, мастера
greenrul (2002-03-12 23:20:00) [10]Так можете помочь?
greenrul (2002-03-12 19:38:00) [11]Не, вы меня не поняли, БЛОКНОТ не причем - вставляться должно в ЛЮБУЮ программу, в которой сейчас работает полькователь - будь то Word, Notepad или 3DMAX
Alx2 (2002-03-12 16:54:00) [12]Блин, выкини только это: With Form1.Memo1.Lines Do
:)))
Alx2 (2002-03-12 16:52:00) [13]Проверил. Работает.
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;
greenrul (2002-03-12 16:39:00) [14]В Notepad тот-же.... только ТЕКСТА несколько строк
Alx2 (2002-03-12 16:06:00) [15]Видимо, ты неправильно указываешь handle дочернего окошка. Оно к тому же должно относится к категории edit controls.
А куда, ты хочешь вставлять текст? Подробнее плз...
greenrul (2002-03-12 16:03:00) [16]А попроще нельзя 8)
почему у меня не вставляет в лругие программы? только в мою?
Alx2 (2002-03-12 15:32:00) [17]Блин, сорри за глюки. Проворонил ссылку на Memo. Она не нужна...
Alx2 (2002-03-12 15:18:00) [18]Ой, вот это место не так :(
А вот так:
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:15:00) [19]Тоже получилось!
Ищем нужной окошко (в этом случае диалоговое окошко из Пуск->выполнить)
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:07:00) [20]Вот это у меня сработало:
PostMessage(Edit1.Handle, WM_PASTE, 0, 0);
Сейчас попробую для чужого приложения...