2010-11-08 92 views
2

我試圖做一個程序,當我按下熱鍵時,它將某個文本連接到窗口中的選定文本。例如:我有文本「捕獲文本用鼠標選擇」,我用鼠標選擇單詞「文本」,現在當我按下某個熱鍵時,它將我複製到剪貼板以下內容:xxx + text + xxx 。 所以我的問題是如何返回鼠標選擇的單詞?捕獲用鼠標選擇的文本

謝謝!!


從什麼ü告訴我,我這understud:

unit Unit4; 

interface 

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

type 
    TForm4 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure WMHotkey(var Message: TWMHotKey); message WM_HOTKEY; 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form4: TForm4; 

implementation 

const 
    MY_ID = 123; 

{$R *.dfm} 

procedure TForm4.FormCreate(Sender: TObject); 
begin 
    RegisterHotKey(Handle, MY_ID, MOD_CONTROL, ord('1')); 

end; 

procedure TForm4.FormDestroy(Sender: TObject); 
begin 
    UnregisterHotKey(Handle, MY_ID); 

end; 

procedure TForm4.WMHotkey(var Message: TWMHotKey); 
lookup_word: string; 
begin 
clipboard.clear; 
    if Message.HotKey = MY_ID then 
    begin 

    if not AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true) then 
     RaiseLastOSError; 

    try 
     SendMessage(GetFocus, WM_GETTEXT, 0, 0); 
     lookup_word:= clipboard.astext; 
     edit1.Text := lookup_word; 
     Clipboard.AsText := '<font color=blue> edit1.text </font>'; 
     SendMessage(GetFocus, WM_PASTE, 0, 0); 
    finally 
     AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), false); 
    end; 


end; 

end; 
end; 
end. 

是這樣行嗎?


我設法以我打算的方式創建我的應用程序。但我現在遇到了另一個問題。它不會在aspx應用程序上工作。它不會識別aspx編輯框中的文本。有沒有解決這個問題的方法?

謝謝!

+1

您已經在SO上發佈了三個問題,他們都在一個新帳戶中。你必須*不*創建一個新的帳戶,每次你想發佈一個新的問題! – 2010-11-08 11:44:38

+1

他可以創建儘可能多的賬戶。他**不應該。 SO沒有關於創建賬戶或匿名的規定。 – 2010-11-08 14:35:30

回答

1

如果我正確理解你的問題,你的意思是「用鼠標選擇的文本」是編輯控件上的正常突出顯示的文本,例如在TEdit,TMemo或TRichEdit中。 如果出現這種情況,那麼VCL有一個包含當前選定文本的Seltext屬性。 所以該代碼將是這樣的:(例如用於TMemo控件)

... 
uses Clipbrd; 
... 
Clipboard.asText:= xxx + Memo1.SelText + xxx; 
... 

如果選擇的文本是從其他應用程序,然後,其非常依賴於由應用程序使用的控制。如果控件是標準的Windows控件或其後代(主要是),則可以通過向該控件發送消息來獲取選定的文本,但是如果該組件不是標準控件,它將不會正確響應該消息。此方法要求您知道目標控件的窗口句柄(使用Windows中的GetFocus單元): 1.通過發送WM_GETTEXT消息獲取全文 2.通過發送EM_GETSEL消息獲取選擇位置 3.計算所選內容文本(整個文本的子字符串),使用從點2開始的位置 。 如果您有一個vcl源代碼,則可以在StdCtrls單元中使用TCustomEdit類源代碼實現作爲參考。 我的例子:

... 
var 
    Buff: array[0..65535] of char; 
... 
function CurrentSelectedText: string; 
var 
    hFocus: hWnd; 
    aStart, aEnd: integer; 
begin 
    //added by andrei, attach input to current thread 
    AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true); 
    hFocus:= GetFocus; 
    SendMessage(hFocus, WM_GETTEXT, 65535, integer(@buff)); 
    SendMessage(hFocus, EM_GETSEL, Integer(@aStart), Integer(@aEnd)); 
    result:= Copy(StrPas(Buff), 1+aStart, aEnd-aStart); 
end; 
+0

沒有。我想讓它粘貼從delphi應用程序之外選擇的文本。如IE或Firefox或微軟Word等 – Andrei 2010-11-08 10:23:00

+0

這是好嗎?如果不是AttachThreadInput(GetCurrentThreadId,GetWindowThreadProcessId(GetForegroundWindow),true)那麼 RaiseLastOSError; 嘗試 SendMessage(GetFocus,WM_COPY,0,0); lookup_word:= clipboard.astext; edit1.Text:= lookup_word; Clipboard.AsText:=' edit1.text'; SendMessage(GetFocus,WM_PASTE,0,0); SendMessage finally AttachThreadInput(GetCurrentThreadId,GetWindowThreadProcessId(GetForegroundWindow),false); – Andrei 2010-11-08 11:21:57

+0

好吧,取決於你想要達到的目標,但是對於「獲取選定的文本」,我更喜歡在內存中獲取/操縱它,而不用在第一時間涉及剪貼板。 – 2010-11-08 11:53:08

0

請不要濫用剪貼板這種方式。提供剪貼板是爲了方便用戶,而不是程序員。如果用戶在剪貼板上有重要的東西,那麼你就會把它擦掉。而且會導致意外/不需要的數據出現在剪貼板擴展程序應用程序中。使用任何類型的遠程桌面產品時,您將導致不需要的網絡流量。

+1

我看到沒有濫用剪貼板。該動作由特殊擊鍵啓動,與Ctrl + C沒有區別。假設用戶知道該操作是剪貼板操作,用戶啓動的操作可以對剪貼板執行任何他們想要的操作。 – 2010-11-08 17:55:06

+0

@Rob,夠公平的,但我經常看到這種事情沒有通知用戶。用戶認爲他們有一個整潔的小通用拼寫檢查器或計算器,並想知道爲什麼他們的剪貼板被覆蓋。 – 2010-11-08 19:28:21