自己编写了一个程序要调用佳能相机的拍摄功能。相机本身提供了一个拍摄软件,该软件有个"拍摄按钮"可直接驱动相机拍摄。拍摄后可以保存到电脑中。我现在试图通过给该"拍摄按钮"发鼠标左键消息,来实现在我自己的软件中完成拍摄功能。现在能得到该按钮的句柄,但发送消息后没有反应。不知道什么缘故?不知道有没有其它的方法实现模拟其点击"拍摄按钮"的功能?谢谢!
我用下面的语句发送的消息,hSend为拍摄按钮的句柄:
::SendMessage(hSend, BM_CLICK , 0 , 0);
我用下面的语句发送的消息,hSend为拍摄按钮的句柄:
::SendMessage(hSend, BM_CLICK , 0 , 0);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
GetDlgItem(YOUR BUTTON ID)->getWindowRect(&rect);
lpPoint.x = rect.left+1;
lpPoint.y = rect.top+1;
这样就可以,应该是句柄值不对,hSend是如何得到的?可以借助SPY++检查一下。
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"。不过我用程序中这种方法得到的值正好和我想要的那个拍摄按钮的句柄是一样的,但发送消息仍然没有反应。
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);
}
相机软件提示“内部出错”,不太明白,我再试试。