如何抓到別支程式的游標位置? |
尚未結案
|
小蟲蟲
一般會員 發表:38 回覆:55 積分:23 註冊:2002-03-13 發送簡訊給我 |
請問先進:
我有一支程式,是沒有輸入焦點的元件(就是不能打字)且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 發送簡訊給我 |
引言: 請問先進: 我有一支程式,是沒有輸入焦點的元件(就是不能打字)且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 發送簡訊給我 |
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 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
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 發送簡訊給我 |
|
enter2004
初階會員 發表:51 回覆:94 積分:34 註冊:2005-04-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |