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

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

2008-3-13 17:37
16481

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

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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

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

[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]
2008-3-14 23:22
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢楼上这位热心的朋友,非常感谢您的热情帮忙。但您给出的方法正是我现在的方法,还是用GetCaretPos,但这个API明显是有缺陷的,至少在IE7里是完全不能用的(返回0,0)。

我给的这个别人的程序,反汇编后,发现他根本没有用GetCaretPos,但他基本上可以在任何起方都取得到光标位置,包括IE7。
2008-3-15 16:54
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
8
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.
2008-3-15 17:08
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
站在高人肩上就是不一样 代码备份一下

[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]
上传的附件:
2008-3-15 19:57
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢楼上的两位朋友,真的非常感谢!解决了这个一直困扰我的问题。

PS:KYLE XY的前面部分挺好看的。 :)
2008-3-15 21:46
0
游客
登录 | 注册 方可回帖
返回
//