如何获取别的进程窗口弹出的系统对话框的句柄

噢麦搞的 2019-02-25 01:28:27
根据两种方法,标题和类名,找出来的句柄都是0
classhwndFather 是父窗口句柄。通过spy_++获得。
用什么正确方法可以获取?

strcpy(szTitleFind,"导出对话框");
classhwndMsgbox= FindTitleWnd(classhwndFather, szTitleFind);
printf("classhwndMsgbox:%d\r\n", classhwndMsgbox);

//类名:#32770 (Dialog)
classhwndMsgbox=FindWithClassName(classhwndFather,"#32770");
printf("classhwndMsgbox:%d\r\n", classhwndMsgbox);


HWND FindTitleWnd(HWND ParentWnd,char szTitleFind[512])
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);

for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
//判断是否为需要的控件
//if ( GetDlgCtrlID(hChild) == ControlID )
char szTitle[512];
GetWindowText(hChild, szTitle, 512);
if (strcmp(szTitleFind,szTitle)==0)
return hChild;

HWND FindWnd=FindTitleWnd(hChild,szTitleFind);
if (FindWnd)
return FindWnd;
}
return NULL;
}

HWND FindWithClassName(HWND ParentWnd,const TCHAR* FindClassName)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);

TCHAR ClassName[100];
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));

if (_tcscmp(ClassName,FindClassName)==0)
return hChild;

HWND FindWnd=FindWithClassName(hChild,FindClassName);
if (FindWnd)
return FindWnd;
}
return NULL;
}
...全文
381 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2019-02-28
  • 打赏
  • 举报
回复
引用 9 楼 luchuan2 的回复:
[quote=引用 4 楼 Eleven 的回复:]
EnumWindows枚举所有的窗口,然后一次调用GetWindowThreadProcessId 得到PID再对比。


这个问题解决了。请问大哥,https://blog.csdn.net/visualeleven/article/details/6403628#commentsedit 你这里有列表框自动点中的代码。我这里要点中的是combobox,请问怎么修改可以实现呢?谢谢。[/quote]
ComboBox_SetCurSel() 找到ComboBox句柄,然后设置一个索引看看,不确定是否有效。
噢麦搞的 2019-02-27
  • 打赏
  • 举报
回复
引用 4 楼 Eleven 的回复:
EnumWindows枚举所有的窗口,然后一次调用GetWindowThreadProcessId 得到PID再对比。


这个问题解决了。请问大哥,https://blog.csdn.net/visualeleven/article/details/6403628#commentsedit 你这里有列表框自动点中的代码。我这里要点中的是combobox,请问怎么修改可以实现呢?谢谢。
Eleven 2019-02-27
  • 打赏
  • 举报
回复
EnumWindows枚举所有的窗口,然后一次调用GetWindowThreadProcessId 得到PID再对比。
schlafenhamster 2019-02-27
  • 打赏
  • 举报
回复
下面是一个例子

// Each time to click "find", data in exe will changes !
void CTestDlg::OnFind()
{
float sNum;

// TODO: Add your control notification handler code here
pWndDlg=FindWindow("#32770","单溢流原始数据输入对话框");
if(pWndDlg==0)
{
AfxMessageBox("单溢流原始数据输入对话框");
return;
}
pWndEdit1000=pWndDlg->GetDlgItem(0x03E8);// 汽相流量的 ID 0x003E8
// pWndEdit1000->SendMessage(WM_SETFOCUS,0,0);
// pWndEdit1000->SendMessage(EM_SETSEL,0,-1);
// get text
// OK
// CString str;
// pWndEdit1000->GetWindowText(str);
// afxDump << str << "\n";
char txt[40];
pWndEdit1000->SendMessage(WM_COPY,0,0);// COPY汽相流量的数据到剪贴板
GetCBtext(txt);//剪贴板上的数据赋值给 txt[40],取出汽相流量输入框值
//
// sscanf(txt,"%f",&m_Edit);// 字符转变为浮点数
// UpdateData(FALSE); // 显示m_Edit的值
// 下面送入新的值
sNum= m_Edit; //C++程序界面 EDIT 汽相流量输入(第一个输入框)
sNum=sNum * xNum[0][m_iCount];
// 乘上系数, 1.0 --0.1 共10个系数,每按一次"寻找窗口" 按钮,系数改变一次
pWndEdit1000->SendMessage(WM_SETFOCUS,0,0);//汽相流量输入框得到焦点
pWndEdit1000->SendMessage(EM_SETSEL,0,-1); // 选中汽相流量输入框
// sNum=1111.22f;
char text[40];
sprintf(text,"%7.2f",sNum);// 浮点数据变成字符
// not OK !
// afxDump << text << "\n";
// pWndEdit1000->SetWindowText(text);
SetCBtext(text);// 送到剪贴板
pWndEdit1000->SendMessage(WM_PASTE,0,0);//PASTE到fhxnt.exe 程序界面的汽相流量输入框
// 新值已送入到 fhcnt.exe 程序界面的汽相流量输入框
m_iCount++; // " 寻找窗口"一次,计数增1,最多10 次.
if (m_iCount>9) m_iCount=0;
// COPYDATASTRUCT cds;
// pWndEdit1000->SendMessage(WM_COPYDATA,(WPARAM)this->m_hWnd,(LPARAM)&cds);
// pWndEdit1000->SendMessage(WM_COPY,0,0);

// pWndEdit1000->PostMessage(WM_KEYDOWN,VK_CONTROL,0x43<<16);
// pWndEdit1000->PostMessage(WM_KEYUP,VK_CONTROL,0x43<<16);
// keybd_event(VK_CONTROL,0x43,0,0);
// keybd_event(VK_CONTROL,0x43,KEYEVENTF_KEYUP,0);
// char editTxt[260]={0};
// int len=pWndEdit1000->SendMessage(EM_GETLINE,0,(LPARAM)editTxt);
// pWndEdit1000->GetWindowText(editTxt,260);
}
schlafenhamster 2019-02-27
  • 打赏
  • 举报
回复
用 spy++ 找 该 对话框中 控件的 ID 。再 根据ID 取控件 hwmd
噢麦搞的 2019-02-27
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
那个对话框必须已显示

肯定先让他显示出来的。
噢麦搞的 2019-02-27
  • 打赏
  • 举报
回复
好的我再试试
zgl7903 2019-02-26
  • 打赏
  • 举报
回复
技术经验分享?

schlafenhamster 2019-02-26
  • 打赏
  • 举报
回复
那个对话框必须已显示
噢麦搞的 2019-02-26
  • 打赏
  • 举报
回复
没有啊。我 获取不到句柄,所以提问。

16,472

社区成员

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

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

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