自己编写了一个程序要调用佳能相机的拍摄功能。相机本身提供了一个拍摄软件,该软件有个"拍摄按钮"可直接驱动相机拍摄。拍摄后可以保存到电脑中。我现在试图通过给该"拍摄按钮"发鼠标左键消息,来实现在我自己的软件中完成拍摄功能。现在能得到该按钮的句柄,但发送消息后没有反应。不知道什么缘故?不知道有没有其它的方法实现模拟其点击"拍摄按钮"的功能?谢谢!
我用下面的语句发送的消息,hSend为拍摄按钮的句柄:
::SendMessage(hSend, BM_CLICK , 0 , 0);

解决方案 »

  1.   

    hSend申明的时候是否是局部变量?,可能是hSend句柄遗失了,你调试一下看看.
      

  2.   

    SetCursorPos(lpPoint.x, lpPoint.y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
      

  3.   

    请问如何采用该方法,lpPoint是如何取得的呀?
      

  4.   

    请问如何采用该方法,lpPoint是如何取得的呀?
    GetDlgItem(YOUR BUTTON ID)->getWindowRect(&rect);
    lpPoint.x = rect.left+1;
    lpPoint.y = rect.top+1;
      

  5.   

    ::SendMessage(hSend, BM_CLICK, 0, 0);
    这样就可以,应该是句柄值不对,hSend是如何得到的?可以借助SPY++检查一下。
      

  6.   

    HWND   hWnd = ::FindWindow(NULL , _T("EOS 400D DIGITAL")); 
      if (!hWnd)
      {
      MessageBox(_T("Confirm the camera has been opened"));
      return;
      }
        ::SetForegroundWindow(hWnd);

    HWND hSend = NULL;
    hSend = FindWindowEx(hWnd, hSend, _T("CMyBmpButton_Class"), _T("REC"));
    if(!hSend)
    {
    MessageBox(_T("hSend is NULL"));
    return;
    }
    ::SendMessage(hSend, BM_CLICK , 0 , 0);//BM_CLICK
    句柄值我用程序得到的和用spy++查到的是同一个值。有个问题是相机自带的软件中有五个按钮,都是"CMyBmpButton_Class"类,名字都是"REC"。不过我用程序中这种方法得到的值正好和我想要的那个拍摄按钮的句柄是一样的,但发送消息仍然没有反应。
      

  7.   

    这个“按钮”不是“BUTTON”类,不能用BM_CLICK消息来控制,可以试试向其父窗口发送WM_COMMAND BN_CLICK消息。
      

  8.   

    问题算是基本解决了,采用了下述方式。相机自带的软件激活到前台,得到“拍摄按钮”的位置,发消息。虽然界面不够流畅,因为有瞬间的界面转换,基本也实现了。谢谢大家的支持。
    void CListFileView::OnButtonAcquierImage() 
    {
    HWND   hWnd = ::FindWindow(NULL , _T("EOS 400D DIGITAL")); 
    if (!hWnd)
    {
    MessageBox(_T("Confirm the camera has been opened"));
    return;
    }
        ::SetForegroundWindow(hWnd);

    HWND hSend = NULL;
    hSend = FindWindowEx(hWnd, hSend, _T("CMyBmpButton_Class"), _T("REC"));
    if(!hSend)
    {
    MessageBox(_T("hSend is NULL"));
    return;
    }
    CRect rect;
    ::GetWindowRect(hSend, &rect); 
        CPoint lpPoint;
    lpPoint.x = rect.left+1; 
        lpPoint.y = rect.top+1;

    ::SetCursorPos(lpPoint.x, lpPoint.y); 
    ::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); 
        ::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
      

  9.   

    提示一下,mouse_event要移动鼠标和激活窗口,而用消息控制是可以在后台操作的,所以通常会优先考虑用消息方式,当然如果不需要支持后台运行,两种方法都是可以的。
      

  10.   

    cnzdgs正如你说的那样,mouse_event是得激活窗口,而且看上去很不方便。我得到了那个按钮的句柄,但发送BM_CLICK消息,没有反应。也可能是它不接受BM_CLICK消息。像你前面回答的那样,请问可以通过给其父窗口发消息到其按钮吗?
      

  11.   

    ::SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(::GetDlgCtrlID(hSend), BN_CLICKED), (LPARAM)hSend);
    相机软件提示“内部出错”,不太明白,我再试试。