Главная страница
    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.5 MB
Время: 0.007 c
4-64864
Velocity
2002-03-16 16:40
2002.05.20
StatusBar и ToolBar на API


14-64803
Box
2002-04-10 15:04
2002.05.20
Архиватор ZIP


1-64711
IDL
2002-05-06 19:36
2002.05.20
Нужен элемент baloon


1-64621
SPeller
2002-05-05 14:08
2002.05.20
DLL и её параметры


3-64478
weak
2002-04-22 16:20
2002.05.20
Как сделать не главную форму MDI-формой?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский