首页
论坛
课程
招聘
[求助]请问:除了用GetCaretPos还有没有别的方法获取光标位置?
2008-3-13 17:37 13739

[求助]请问:除了用GetCaretPos还有没有别的方法获取光标位置?

2008-3-13 17:37
13739
这个问题困扰了我很久了,因为在IE7和WORD里GetCaretPos是不能获取光标位置的,但有一个人写的程序却是可以的。我反汇编了一下,发现他完全没用GetCaretPos,不知道是怎么实现的。。。。。。惭愧。。。。请有经验的朋友帮忙看看,谢谢

这是那个人程序的地址
http://skh.cn/soft/CaretPos.exe

[公告] 2021 KCTF 春季赛 防守方征题火热进行中!

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 活跃值 2008-3-14 13:40
2
0
C++ 不过关~~~ 写不出来....delphi没装.
上传的附件:
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 活跃值 2008-3-14 15:15
3
0
用易语言做了一个~~~
上传的附件:
  • 1.gif (75.37kb,223次下载)
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 活跃值 2008-3-14 15:27
4
0
也挺简单的~~~  但是c++就......
上传的附件:
  • 2.gif (145.67kb,216次下载)
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 活跃值 2008-3-14 16:34
5
0
终于把C++的写出来了
上传的附件:
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 活跃值 2008-3-14 23:22
6
0
我这只小菜鸟终于完成了艰巨的任务....

[QUOTE=]CPoint point;

        CRect rect;
        GetWindowRect(&rect);
        HWND hwnd=::GetFocus();
        HWND pHwnd=::GetForegroundWindow();

        CString cs;

        AttachThreadInput(GetCurrentThreadId(),::GetWindowThreadProcessId(pHwnd,NULL),TRUE);

    ::GetCaretPos(&point);
        ::ClientToScreen(hwnd,&point);

        if(pHwnd!=GetSafeHwnd())
        {
                AfxGetMainWnd()->SetWindowPos(&wndTopMost,point.x+5,point.y+15,rect.left,rect.bottom,SWP_NOACTIVATE|SWP_NOSIZE|SWP_SHOWWINDOW);
               
                cs.Format("%d",hwnd);
                SetWindowText("当前窗口句柄:"+cs);
                cs.Format("%d  %d",point.x,point.y);
                CWnd::GetDlgItem(IDC_STATIC)->SetWindowText("当前点:"+cs);

                ShowWindow(SW_SHOW);
        UpdateData();[/QUOTE]
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sketch 活跃值 2008-3-15 16:54
7
0
谢谢楼上这位热心的朋友,非常感谢您的热情帮忙。但您给出的方法正是我现在的方法,还是用GetCaretPos,但这个API明显是有缺陷的,至少在IE7里是完全不能用的(返回0,0)。

我给的这个别人的程序,反汇编后,发现他根本没有用GetCaretPos,但他基本上可以在任何起方都取得到光标位置,包括IE7。
雪    币: 217
活跃值: 活跃值 (12)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 活跃值 13 2008-3-15 17:08
8
0
HWND __cdecl sub_44DAD4()
{
  HWND result; // eax@1
  struct tagGUITHREADINFO pgui; // [sp+8h] [bp-34h]@1
  POINT pt; // [sp+0h] [bp-3Ch]@2

  pgui.cbSize = 48;
  GetGUIThreadInfo(0, &pgui);
  result = pgui.hwndCaret;
  if ( pgui.hwndCaret )
  {
    pt.x = pgui.rcCaret.right;
    pt.y = pgui.rcCaret.bottom;
    ClientToScreen(pgui.hwndCaret, &pt);
    Controls__TControl__SetLeft();
    result = (HWND)Controls__TControl__SetTop();
  }
  return result;
}

Hey-rayed.
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 活跃值 2008-3-15 19:57
9
0
站在高人肩上就是不一样 代码备份一下

[QUOTE=]        HWND hwnd;
    GUITHREADINFO pg;

        POINT point;

        pg.cbSize=48;
        ::GetGUIThreadInfo(NULL,&pg);
        hwnd=pg.hwndCaret;
        if (pg.hwndCaret)
        {
                point.x=pg.rcCaret.right;
                point.y=pg.rcCaret.bottom;
                ::ClientToScreen(pg.hwndCaret,&point);
                AfxGetMainWnd()->SetWindowPos(&wndTopMost,point.x,point.y,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_SHOWWINDOW);
        }[/QUOTE]
上传的附件:
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sketch 活跃值 2008-3-15 21:46
10
0
谢谢楼上的两位朋友,真的非常感谢!解决了这个一直困扰我的问题。

PS:KYLE XY的前面部分挺好看的。 :)
游客
登录 | 注册 方可回帖
返回