全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1958
推到 Plurk!
推到 Facebook!

如何抓到別支程式的游標位置?

尚未結案
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-31 11:39:18 IP:203.77.xxx.xxx 未訂閱
請問先進: 我有一支程式,是沒有輸入焦點的元件(就是不能打字)且Topmost。 這支程式,要監測所在ActiveWindow的游標位置。 如,NotePad是Active時,可以抓到NotePad的游標位置。 Word是Active時,可以抓到NotePad的游標位置。 Outlook是Active時,可以抓到NotePad的游標位置。 我試過:BOOL GetCaretPos(LPPOINT lpPoint); 可惜的是,這API只能抓目前Process的游標,不能抓其他Process的游標。 請問,該如何解? 謝謝。
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-31 15:11:01 IP:211.74.xxx.xxx 未訂閱
引言: 請問先進: 我有一支程式,是沒有輸入焦點的元件(就是不能打字)且Topmost。 這支程式,要監測所在ActiveWindow的游標位置。 如,NotePad是Active時,可以抓到NotePad的游標位置。 Word是Active時,可以抓到NotePad的游標位置。 Outlook是Active時,可以抓到NotePad的游標位置。 我試過:BOOL GetCaretPos(LPPOINT lpPoint); 可惜的是,這API只能抓目前Process的游標,不能抓其他Process的游標。 請問,該如何解? 謝謝。
1.使用FindWindow抓取視窗Handle 2.使用GetCursorPos抓取營幕的游標位置 3.使用windows.ScreenToClient進行位置轉換
  h:=FindWindow('NotePad',nil);
  GetCursorPos(p);
  window.ScreenToClient(h,p);
  //游標位置在 NotePad的p.x & p.y位置
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-31 15:56:15 IP:218.160.xxx.xxx 未訂閱
Hi 小蟲蟲: 若要抓取ActiveWindow可以使用GetActiveWindow, 改寫如下

procedure TForm1.Timer1Timer(Sender: TObject);
var TheText : PChar;
    P : TPoint;
begin
   GetMem(TheText, GetWindowTextLength(GetActiveWindow));
   GetWindowText(GetActiveWindow, TheText, GetWindowTextLength(GetActiveWindow) 1);
   GetCursorPos(p);
   Windows.ScreenToClient(GetActiveWindow,p);
   Memo1.Lines.Add(String(TheText) ' ' IntToStr(p.x) '  ' IntToStr(p.y));
   FreeMem(TheText);
end;
上面的程式有一個問題是抓ActiveWindow的標題好像不行, 也許有其他大大看到可以幫忙一下 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-31 17:35:54 IP:203.77.xxx.xxx 未訂閱
謝謝先進! 我可能描述錯了,我指的不是滑鼠的指標,是Caret插入光棒(?) 不好意思!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-31 18:30:44 IP:218.163.xxx.xxx 未訂閱

function GetCaretPosition(var APoint: TPoint): Boolean;
var w: HWND;
  aID, mID: DWORD;
begin
  Result:= False;
  w:= GetForegroundWindow;
  if w <> 0 then
  begin
    aID:= GetWindowThreadProcessId(w, nil); 
    mID:= GetCurrentThreadid;
    if aID <> mID then 
    begin
      if AttachThreadInput(mID, aID, True) then 
      begin
        w:= GetFocus; 
        if w <> 0 then
        begin 
          Result:= GetCaretPos(APoint);
          Windows.ClientToScreen(w, APoint); 
        end;
        AttachThreadInput(mID, aID, False); 
      end;
    end;
  end;
end;    procedure TForm1.Timer1Timer(Sender: TObject);
var
  NotePad:HWND;
  Pt: TPoint;
begin
  NotePad:=FindWindow('NotePad', nil);
 if NotePad<>0 then
  if GetCaretPosition(Pt) then
  begin
    Label1.Caption :=(Format('Caret 位置: %d %d', [Pt.x, Pt.y]));
    //SetCursorPos(Pt.X, Pt.Y);
  end;
end;     
網海無涯,學無止境!
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-02 20:36:39 IP:61.229.xxx.xxx 未訂閱
謝謝qoo1234的幫忙
enter2004
初階會員


發表:51
回覆:94
積分:34
註冊:2005-04-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-11 20:45:45 IP:140.113.xxx.xxx 未訂閱
我想請問說 以上程式可以運作在word,notepad,IE,IE裡的輸入表單 但是卻無法運作在firefox 我要如何查到在firefox裡的鍵盤caret位置?
------
人生就像泡泡一樣,乘著風被吹著跑,等你發現時已經消失了。
就在快要消失的瞬間,希望能再飛高一點,
但是回神時總是慢了一步。
系統時間:2024-05-05 15:35:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!