Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
1-64565
Wolverin
2002-05-04 21:58
2002.05.20
RES


3-64510
maxim2
2002-04-23 12:01
2002.05.20
OpenDialog


3-64532
ProfiUgl
2002-04-23 15:23
2002.05.20
ADOQuery1 ->> ADOQuery2


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


14-64820
vopros
2002-04-11 17:14
2002.05.20
vopros ты меня достал уже.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский