前言
最近在给应用程序添加一个新的高拍仪硬件工具,原本计划是直接在应用程序中添加相关的驱动,直接进行硬件调用,试了几天后发现这个驱动在应用程序中并不好使,并且这个应用程序逻辑很复杂,也不可能进行重写,于是在撞了几天墙之后想到了新思路,直接调用硬件工具现有的测试工具,这不就解决了么~ ~为榆木脑袋想哭
思路
直接说思路吧,比较简单,在应用程序需要使用硬件工具的时候直接加载高拍仪测试exe,并且同步检测交互接口,等待高拍仪拍摄图像。当获取到高拍仪图像的时候应用程序继续进行剩下的操作。 为了美化应用效果,可以在高拍仪拍摄图像后直接隐藏exe界面,转为应用程序界面。
代码
1.应用程序调用硬件exe
HWND GetIVAWindowAndProcess(HANDLE& hProcess)
{
HWND hWnd = NULL;
hWnd = ::FindWindow(NULL,"ShootCapture");
//是否能找到,找不到就去启动下
if(hWnd == NULL)
{
int nNumberDely = 10;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
"xx.exe", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
AfxMessageBox(_T("启动拍照功能失败!"));
return NULL;
}
CloseHandle(pi.hThread);
WaitForInputIdle(pi.hProcess,INFINITE);
hProcess = pi.hProcess;
while((hWnd = ::FindWindow(NULL,"ShootCapture")) == NULL && nNumberDely > 0)
{
Sleep(500);
nNumberDely --;
}
}
else
{
DWORD dwProcessId = 0;
DWORD dwThreadId = 0;
dwThreadId = GetWindowThreadProcessId(hWnd,&dwProcessId);
hProcess = OpenProcess(PROCESS_ALL_ACCESS,NULL,dwProcessId);
}
::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREPOSITION );
ShowWindow(hWnd,SW_SHOW);//展示在最前端展示界面
return hWnd;
}
- 测试工具拍照后隐藏界面
ShowWindow(SW_HIDE);
3.当应用程序结束后,在进程中销毁测试工具exe
HWND hWnd = NULL;
hWnd = ::FindWindow(NULL,"ShootCapture");
//是否能找到,找不到就去启动下
if(hWnd != NULL)
{
int kk=::SendMessage(hWnd,WM_CLOSE,0,0);
}
- 交互部分
此处比较简单,即可以让应用程序一直检测某个文件夹目录是否有新文件即可。
后话
整体思路还是挺简单的,就是之前自己撞墙了,非要融合到一起去,捣鼓几天,结果没出来,倒是对高拍仪研究挺多,算是意外收获吧,后来发现问题出在高拍仪提供的动态库里,这个没源码也改不了,后来才想用这种方法。使用一段时间后发现,这样两个程序互不干扰,都很容易修改代码,并且以后在应用程序上可以使用此种思路添加更多外接硬件。