Форум: "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