gpt4 book ai didi

c++ - 进程保留在应用程序退出时

转载 作者:行者123 更新时间:2023-11-28 06:55:35 26 4
gpt4 key购买 nike

在我关闭我的应用程序的主窗口后,进程仍然列在 Windows 任务管理器的进程列表中。

这是下面的代码,任何人都知道要修改什么才能在应用程序退出(或主窗口关闭)时成功退出进程。

int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev,LPSTR cmd,int show)
{
HRESULT hr = CoInitialize(0); MSG msg={0}; DWORD no;

IGraphBuilder* graph= 0; hr = CoCreateInstance( CLSID_FilterGraph, 0, CLSCTX_INPROC,IID_IGraphBuilder, (void **)&graph );
IMediaControl* ctrl = 0; hr = graph->QueryInterface( IID_IMediaControl, (void **)&ctrl );

ICreateDevEnum* devs = 0; hr = CoCreateInstance (CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &devs);
IEnumMoniker* cams = 0; hr = devs?devs->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &cams, 0):0;
IMoniker* mon = 0; hr = cams->Next (1,&mon,0); // get first found capture device (webcam?)
IBaseFilter* cam = 0; hr = mon->BindToObject(0,0,IID_IBaseFilter, (void**)&cam);
hr = graph->AddFilter(cam, L"Capture Source"); // add web cam to graph as source
IEnumPins* pins = 0; hr = cam?cam->EnumPins(&pins):0; // we need output pin to autogenerate rest of the graph
IPin* pin = 0; hr = pins?pins->Next(1,&pin, 0):0; // via graph->Render
hr = graph->Render(pin); // graph builder now builds whole filter chain including MJPG decompression on some webcams
IEnumFilters* fil = 0; hr = graph->EnumFilters(&fil); // from all newly added filters
IBaseFilter* rnd = 0; hr = fil->Next(1,&rnd,0); // we find last one (renderer)
hr = rnd->EnumPins(&pins); // because data we are intersted in are pumped to renderers input pin
hr = pins->Next(1,&pin, 0); // via Receive member of IMemInputPin interface
IMemInputPin* mem = 0; hr = pin->QueryInterface(IID_IMemInputPin,(void**)&mem);

DsHook(mem,6,Receive); // so we redirect it to our own proc to grab image data

hr = ctrl->Run();

while ( GetMessage( &msg, 0, 0, 0 ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
};

最佳答案

免责声明:我没有尝试让它看起来漂亮或进行错误检查。据我所知它可以工作(当我关闭窗口时,应用程序结束),但它根本不是示例代码。

窗口不会自己发送 WM_QUIT 消息;你必须自己做。您可以按如下方式进行:

为消息创建一个窗口:

WNDCLASSEX wx = {};
wx.cbSize = sizeof(WNDCLASSEX);
wx.lpfnWndProc = proc; // function which will handle messages
wx.hInstance = GetModuleHandle(0);
wx.lpszClassName = "some class";
RegisterClassEx(&wx);
HWND hwnd = CreateWindowEx(0, "some class", "some name", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);

创建一个 IMediaEventEx * 并使用它来将通知定向到窗口:

我假设一个全局 IMediaEventEx *event;。请不要以快速肮脏的方式进行。

graph->QueryInterface(IID_IMediaEventEx, (void **) &event);
event->SetNotifyWindow((OAHWND) hwnd, WM_APP + 1, 0);

让窗口过程处理用户中止的情况:

LRESULT CALLBACK proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (msg == WM_APP + 1) {
long evt;
LONG_PTR param1, param2;

while (SUCCEEDED(event->GetEvent(&evt, &param1, &param2, 0))) {
event->FreeEventParams(evt, param1, param2);

if (evt == EC_USERABORT) {
PostQuitMessage(0);
}
}
}

return DefWindowProc(hwnd, msg, wParam, lParam);
}

关于c++ - 进程保留在应用程序退出时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23230568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com