知道一个窗口的ID,用什么函数得到它的句柄?

Aist-memory 2018-08-07 05:30:25
知道一个Formview窗口的ID,用什么函数得到它的句柄?

想实现在一个formview里 得到另一个formview的窗口句柄, 好向他发消息。 ID已知, 有办法吗?
...全文
270 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aist-memory 2018-08-08
  • 打赏
  • 举报
回复
没问题了, 就是 CWnd *pWnd = AfxGetMainWnd();
Aist-memory 2018-08-08
  • 打赏
  • 举报
回复
m_wndSplitter.GetPane(0, 0) // 左 m_wndSplitter.GetPane(0, 1) // 右 没有问题 目前问题 是 如何得到主对话框句柄 (从formview1里), formview1是主对话框一个切分子窗口 , 不得到 主对话框我没法调用 m_wndSplitter.GetPane(0, 0)
schlafenhamster 2018-08-08
  • 打赏
  • 举报
回复
那么
m_wndSplitter.GetPane(0, 0) // 左
m_wndSplitter.GetPane(0, 1) // 右
Aist-memory 2018-08-08
  • 打赏
  • 举报
回复
有 m_wndSplitter
schlafenhamster 2018-08-08
  • 打赏
  • 举报
回复
有没有 m_wndSplitter. ?
Aist-memory 2018-08-08
  • 打赏
  • 举报
回复
我 是 对话框切分窗口, 用不到 CMainFrame 目前问题 是 如何得到主对话框句柄 (从formview1里), formview1是主对话框一个切分子窗口
Aist-memory 2018-08-08
  • 打赏
  • 举报
回复
FindWindow 好像不能找子窗口, 只能找 top window 现在只好通过主对话框去 找那个 formview2 子窗口 在 formview1 里 HWND hWnd = ::GetParent(this->GetSafeHwnd()); 没能得到主对话框的 句柄 目前问题 是 如何得到主对话框句柄 (从formview1里), formview1是对话框一个切分子窗口
schlafenhamster 2018-08-08
  • 打赏
  • 举报
回复
"formview2 好像不能设置 caption, FindWindow 就不起作用"
使用窗口 类 ,不用 caption
schlafenhamster 2018-08-08
  • 打赏
  • 举报
回复
切分窗口的 两个子窗口
mainframe 中
virtual ~CMainFrame();
CHMI_manView* GetRightPane();// list
CLeftView* GetLeftPane(); // tree

// CMainFrame message handlers
CHMI_manView* CMainFrame::GetRightPane()
{
CWnd* pWnd = m_wndSplitter.GetPane(0, 1);
CHMI_manView* pView = DYNAMIC_DOWNCAST(CHMI_manView, pWnd);
return pView;
}
////
CLeftView* CMainFrame::GetLeftPane()
{
CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
CLeftView* pView = DYNAMIC_DOWNCAST(CLeftView,pWnd);
return pView;
}


调用
// get rightpane
CMainFrame* pMain=(CMainFrame*)AfxGetMainWnd();
CHMI_manView* pView=pMain->GetRightPane();
//
// get LeftTree
CMainFrame* pMain=(CMainFrame*)AfxGetMainWnd();// m_pMainWnd;
CLeftView * pLeft=pMain->GetLeftPane();
Aist-memory 2018-08-07
  • 打赏
  • 举报
回复
formview1和 formview2 是 dialog 切分窗口的 两个子窗口, 设置为 child, 没有父子关系, 现要从 formview1向 formview2 发消息, 知道 formview2的ID , 如何得到 formview2 的窗口句柄? formview2 好像不能设置 caption, FindWindow 就不起作用
Aist-memory 2018-08-07
  • 打赏
  • 举报
回复
findwindow 第二个参数是另一个窗口的caption? 在另一个窗口里怎么设置这第二个参数的值啊?
schlafenhamster 2018-08-07
  • 打赏
  • 举报
回复
findwindow
Aist-memory 2018-08-07
  • 打赏
  • 举报
回复
这两个formview没有父子关系, 要从一个formview向另一个formview发消息, 我 想获得那个formview的窗口句柄 GetDlgItem 是获得窗口上一个控件的句柄吧, 能用来获得另一个窗口句柄吗? 是不是这样写 GetDlgItem(m_Hwnd1, IDD_FORMVIEW2)
三岁、就很帅 2018-08-07
  • 打赏
  • 举报
回复
hwndScroll = GetDlgItem(hwnd, IDC_SCROLL);

假设一个父窗口中有多个子窗口。那么本函数是返回一个子窗口句柄。

第一个参数:父窗口句柄

第二个参数:子窗口ID

再假设 父窗口是一个对话框,子窗口是对话框中的一个滚动条

那么上面代码就很清晰了 hwndScroll就是滚动条的窗口句柄HWND
schlafenhamster 2018-08-07
  • 打赏
  • 举报
回复
GetDlgItem
The GetDlgItem function retrieves the handle of a control in the specified dialog box.

HWND GetDlgItem(
HWND hDlg, // handle of dialog box or the other formview
int nIDDlgItem // identifier of control
);

Parameters
hDlg
Identifies the dialog box that contains the control.
nIDDlgItem
Specifies the identifier of the control to be retrieved.
VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口句柄.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程名 进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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