求高手帮忙,取得光标当前位置的句柄?

skype_2009 2009-05-27 11:50:07
while (1) 
{
Sleep(100);
POINT pt; GetCursorPos(&pt);
hWnd = ::WindowFromPoint(pt);
if (hWnd != NULL)
{
CString strItem = L"精ab瑞cd电脑汉字";
char szItem[] = "精ab瑞cd电脑汉字";
WCHAR wszItem[256];
m_edtInput.SetFocus();

memset(wszItem, 0, sizeof(wszItem));
MultiByteToWideChar(CP_ACP, 0, szItem, strlen(szItem), wszItem, strlen(szItem));
for (int i = 0; i < wcslen(wszItem); i ++)
{
::SendMessage(hWnd, WM_CHAR, wszItem[i], 1);
}
break;
}
else
continue;
}


为什么向光标当前位置发送wszItem,得不到呢?

用SetTimer()也是不行,是错在哪?
...全文
70 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
skype_2009 2009-05-27
  • 打赏
  • 举报
回复
快来帮我下
hendriclee 2009-05-27
  • 打赏
  • 举报
回复
关注。。。
bobo_2003 2009-05-27
  • 打赏
  • 举报
回复
OnTimer()改为如下

POINT pnt;

RECT rc;
HWND DeskHwnd = ::GetDesktopWindow(); //取得桌面句柄
HDC DeskDC = ::GetWindowDC(DeskHwnd); //取得桌面设备场景

int oldRop2 = SetROP2(DeskDC, R2_NOTXORPEN);
::GetCursorPos(&pnt); //取得鼠标坐标
HWND UnHwnd = ::WindowFromPoint(pnt) ; //取得鼠标指针处窗口句柄

g_hWnd=UnHwnd;
HWND grayHwnd = ::GetWindow(g_hWnd, GW_CHILD);
RECT tempRc;
BOOL bFind=FALSE;
while (grayHwnd)
{
::GetWindowRect(grayHwnd, &tempRc);
if(::PtInRect(&tempRc,pnt))
{
bFind = TRUE;
break;
}
else
grayHwnd = ::GetWindow(grayHwnd, GW_HWNDNEXT);

}//while
if(bFind == TRUE)
{
bFind= FALSE;
g_hWnd = grayHwnd;
}
else
;//Wnd=UnHwnd
skype_2009 2009-05-27
  • 打赏
  • 举报
回复
OnTimer()消息的代码
POINT pt; 
::GetCursorPos(&pt);
POINT ptScreen=pt;
m_hParent=GetDesktopWindow()->GetSafeHwnd();
m_hChild=::ChildWindowFromPoint(m_hParent,pt);
pt=ptScreen;
::ScreenToClient(m_hChild,&pt);
while(m_hParent != m_hChild)
{
m_hParent=m_hChild;

m_hChild=::ChildWindowFromPoint(m_hParent,pt);
pt=ptScreen;
::ScreenToClient(m_hChild,&pt);
}


然后得到句柄,发送信息也是不行的,这错在哪?
CString strItem = L"精ab瑞cd电脑汉字";
char szItem[] = "精ab瑞cd电脑汉字";
WCHAR wszItem[256];
m_edtInput.SetFocus();

memset(wszItem, 0, sizeof(wszItem));
MultiByteToWideChar(CP_ACP, 0, szItem, strlen(szItem), wszItem, strlen(szItem));

if(m_hChild != NULL)
{
for (int i = 0; i < wcslen(wszItem); i ++)
{
::SendMessage(m_hChild, WM_CHAR, wszItem[i], 1);
}
}
fishion 2009-05-27
  • 打赏
  • 举报
回复
ScreenToClient
skype_2009 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fishion 的回复:]
用mouse hook
LRESULT CALLBACK MouseProc( int nCode,
WPARAM wParam,
LPARAM lParam
);
lParam
[in] Pointer to a MOUSEHOOKSTRUCT structure.

typedef struct {
POINT pt;
HWND hwnd;
UINT wHitTestCode;
ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
[/Quote]

可以给个例子吗?
fishion 2009-05-27
  • 打赏
  • 举报
回复
用mouse hook
LRESULT CALLBACK MouseProc( int nCode,
WPARAM wParam,
LPARAM lParam
);
lParam
[in] Pointer to a MOUSEHOOKSTRUCT structure.

typedef struct {
POINT pt;
HWND hwnd;
UINT wHitTestCode;
ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
skype_2009 2009-05-27
  • 打赏
  • 举报
回复
这样,只能传到IDC_CTRL1上,我想做的,是把光标题到哪,就送到哪上
zhaodaich 2009-05-27
  • 打赏
  • 举报
回复
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case 'V':
if(::GetKeyState(VK_CONTROL) < 0)
{
CWnd* pChildWnd = GetFocus();
if(*pChildWnd == * GetDlgItem(IDC_CTRL1))
{
CString str;
pChildWnd->GetWindowText(str);
pChildWnd->SetWindowText(str+"hahaha");
}
}
return TRUE;

}
}

return CDialog::PreTranslateMessage(pMsg);
}

其中:
pChildWnd->SetWindowText(str+"hahaha");
中的"hahaha"可换成你的:m_sMessage
skype_2009 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhaodaich 的回复:]
两API函数GetCursorPos和WindowFromPoint即可搞定~
[/Quote]

也是用这个两个API,可是就是不行,hWnd也不为空呀,就是SendMessage不成功
zhaodaich 2009-05-27
  • 打赏
  • 举报
回复
两API函数GetCursorPos和WindowFromPoint即可搞定~

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧