现在想做一个简单的程序,一个按钮响应函数实现另外一个外部程序(如word)的菜单点击效果。基本思路是获取打开的word的窗口句柄h,然后通过h获得菜单句柄,但是word的窗口句柄总是获取不到菜单句柄hMenu。后来改用记事本,发现能够通过记事本窗口句柄获取记事本的菜单。考虑了一下,word和记事本的区别:一个是多文档程序,一个是单文档程序。
对单文档(记事本)有效的程序如下:
void CTestDlg::OnTest() 
{
// TODO: Add your control notification handler code here
HWND hFig = ::FindWindow(NULL,"无标题 - 记事本");   //找到窗口,并返回窗口句柄
    if(hFig == NULL)
{
       MessageBox("未能找到指定窗口");
}
else{MessageBox("找到了");}
    CWnd * cwnd;
cwnd=FromHandle(hFig);

CString s;
cwnd->GetWindowText(s);
AfxMessageBox(s);
CMenu * menu = cwnd->GetMenu();
if(menu!=NULL){
menu->GetSubMenu(0)->GetMenuString(1,s,MF_BYPOSITION);
AfxMessageBox(s);
}
}请教一下,如何实现对多文档的模拟点击菜单功能。是不是在多文档中HWND hFig = ::FindWindow(NULL,"文档1.doc - Microsoft Word"); 获得的句柄不是主窗口的句柄?如果不是,应该如何通过hFig获得主窗口的句柄,再获得菜单的句柄?

解决方案 »

  1.   

    Word的菜单不是标准的窗口菜单,不能通过GetMenu来获得。你可以试试直接向窗口发送WM_COMMAND消息。
      

  2.   

    你好,cnzdgs 。按照你说的直接向word窗口发送WM_COMMAND,下面函数的后面两个参数应该怎么填啊?窗口怎么将消息映射到具体某个菜单项啊?LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
      

  3.   

    wParam给菜单项的ID,lParam给0。
      

  4.   

    可以用SPY++监视窗口的WM_COMMAND消息,然后点击菜单项,根据SPY++记录的信息查出ID值。
      

  5.   

    感谢cnzdgs ,搞定,结贴!