API - trocar mensagens de texto entre dois programas

Top  Previous  Next

Question/Problem/Abstract:

 

Did you face a situation where you need to copy/paste some text from another application to your application (we are not talking about OLE)? 

Answer:

 

 

Here is the code: 

 

Function GetOtherWindowMemoText(const sCaption : String) : WideString; 

var 

         hWindow : THandle; 

         hChild  : THandle; 

 

         aTemp      : array[0..5000of Char; 

         sClassName : String; 

begin 

         Result := ''

 

         hWindow := FindWindow(Nil,PChar(sCaption)); 

 

         if hWindow = 0 then begin 

            ShowMessage('Could NOT find the other program'); 

            exit

         end

 

         hChild := GetWindow(hWindow, GW_CHILD); 

         while hChild <> 0 do Begin 

               if GetClassName(hChild, aTemp, SizeOf(aTemp)) > 0 then begin 

                  sClassName := StrPAS(aTemp); 

 

                  if sClassName = 'Edit' then begin 

                     SendMessage(hChild,WM_GETTEXT,SizeOf(aTemp),Integer(@aTemp)); 

 

                     Result := StrPAS(aTemp); 

                  end

               end

               hChild := GetWindow(hChild, GW_HWNDNEXT); 

         end

end

 

Function SetOtherWindowMemoText(const sCaption : String; const sText : String) : WideString; 

var 

         hWindow : THandle; 

         hChild  : THandle; 

 

         aTemp      : array[0..5000of Char; 

         sClassName : String; 

begin 

         Result := ''

 

         hWindow := FindWindow(Nil,PChar(sCaption)); 

 

         if hWindow = 0 then begin 

            ShowMessage('Could NOT find the other program'); 

            exit

         end

 

         hChild := GetWindow(hWindow, GW_CHILD); 

         while hChild <> 0 do Begin 

               if GetClassName(hChild, aTemp, SizeOf(aTemp)) > 0 then begin 

                  sClassName := StrPAS(aTemp); 

 

                  if sClassName = 'Edit' then begin 

                     StrPCopy(aTemp,sText); 

                     SendMessage(hChild,WM_SETTEXT,SizeOf(aTemp),Integer(@aTemp)); 

                  end

               end

               hChild := GetWindow(hChild, GW_HWNDNEXT); 

         end

end

 

Let say you want to get the text from Notepad, then you should pass the title of notepad to the previous function and assign the return value to Rich edit.  An example: 

 

............................................... 

//Get text from noteppad. 

RichEdit1.Lines.Text := GetOtherWindowMemoText('Untitled - Notepad'); 

............................................... 

//Set notepad memo text. 

SetOtherWindowMemoText('Untitled - Notepad',RichEdit1.Lines.Text); 

............................................... 

 

Regards, 

Abdulaziz Jasser