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

标签 c++ windows winapi

在我关闭我的应用程序的主窗口后,进程仍然列在 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/

相关文章:

java - XLS 函数的 Octave 错误

delphi - 系统错误。代码 : 8. 没有足够的存储空间来处理此命令

c# - 通过 SendMessage 或其他方式异步 GetForegroundWindow?

c++ - 如果 switch 语句达到默认值,则重复 do while 循环

C++ 查找数组中出现次数最多的元素

c++ - 为什么 "default"是复制/移动构造函数或析构函数?

windows - "start %comspec%/c script.cmd"与 "start cmd/C script.cmd"

Android:使用静态 libgnuSTL 的 native C++ 程序的 SEGFAULT

c# - Web 应用程序可以访问和修改 Windows 的注册表吗?

c - C语言的设备通知程序