Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > выделенный текст


Автор: Artik 10.1.2008, 12:21
У меня есть мемо, лабел и таймер на форме. В таймере я получаю хендл активного окна, заголовок вишу в лабел. Дальше надо из этого активного окна получить выделенный текст (если он вообще там есть). Думаю надо узнать хендл активного компонента, но как? И я не знаю, как получить именно выделенный текст, а не весь. Помогите плиз
Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
 str:array[0..255] of char;
begin
HWN := Windows.GetForegroundWindow;
Getwindowtext(HWN,@str,256);
Label1.Caption:=str;
// дальше нужна помощь
end;


Автор: Rennigth 10.1.2008, 16:08
Artik, 
AttachThreadInput + GetFocus

Автор: Artik 11.1.2008, 13:31
Можно кодом плиз, чтобы вставить в мой вышенаписанный. Я не писал бы в этом разделе если бы хорошо разбирался в Делфи 

Автор: Rennigth 11.1.2008, 14:15
Цитата(Artik @  11.1.2008,  13:31 Найти цитируемый пост)
Можно кодом плиз, чтобы вставить в мой вышенаписанный. Я не писал бы в этом разделе если бы хорошо разбирался в Делфи  

вот накатал примерчик.
Код

unit Unit25;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm25 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form25: TForm25;

implementation

{$R *.dfm}

//function GetThreadId(hThread: THandle): DWORD; stdcall; external 'Kernel32.dll';

procedure TForm25.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := true;
end;

procedure TForm25.Timer1Timer(Sender: TObject);
var
  hFrgdWnd, hFocusWnd: HWND;
  dwThreadID, dwCurThreadID, dwProcessID: DWORD;
  hThread: THandle;
  pText: PChar;
begin
  hFrgdWnd := GetForegroundWindow;
  dwCurThreadID := GetCurrentThreadId;
  if (hFrgdWnd > 0) and (dwCurThreadID > 0) then
  begin
    dwThreadID := GetWindowThreadProcessId(hFrgdWnd, dwProcessID);
    if dwThreadID > 0 then
    begin
      if dwThreadID <> dwCurThreadID then
        AttachThreadInput(dwThreadID, dwCurThreadID, True);

      hFocusWnd := GetFocus;
      if hFocusWnd > 0 then
      begin
        pText := GetMemory(MAX_PATH);
        try
          GetWindowText(hFocusWnd, pText, MAX_PATH);
          ShowMessage(pText);
        finally
          FreeMemory(pText);
        end;
      end;
      if dwThreadID <> dwCurThreadID then
        AttachThreadInput(dwThreadID, dwCurThreadID, False);
    end;
  end;

end;

end.

Автор: Artik 17.1.2008, 07:12
Да этот код работает, но маленько не так, проверить очень просто, открываем обычный блокнот, и прога не видит текст в нём :( 
Я помню раньше тыкал как примат, тупо меняя значения и прочие в своём коде после Label1.Caption:=str; с функциями FindWindowEx либо EnumChildWindows. Может лучши их использовать, с ними у меня хотябы в блокноте работало, но увы в нём и только в нём :( 
Текст я так-же брал Getwindowtext(HWN,@str,256);

Автор: Alexzz 19.1.2008, 03:41
Цитата
И я не знаю, как получить именно выделенный текст, а не весь.

У всяких там редакторов типа Tedit или TLabeledEdit есть такие свойства как .Selstart и .Sellength, из которых можно получить начало и длину выделенного фрагмента. Ну и если .SelLength=0 то соответственно ничего не выделено, а SelStart просто указывает на курсор.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)