Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Выключить программу по таймеру


Автор: Kozel 18.1.2008, 20:10
Собственно надо писать уже с кодом... но когда даже не представляешь как это сделать для начало думаю можно проста так спросить.
Собтвенно я хочу, чтобы из моей программы выключалась другая по таймеру.
Ну вот собстенно весь вопрос.

Автор: JackYF 18.1.2008, 20:54
ОС, инструментальные средства?

Автор: Kozel 19.1.2008, 01:24
Ось стандартна - Винда ХР. Средства - тоже особых критериев нету. Думаю Билдер или VC++

Автор: archimed7592 19.1.2008, 02:09
Цитата(Kozel @  19.1.2008,  01:24 Найти цитируемый пост)
Ось стандартна - Винда ХР.

smile

Автор: W4FhLF 19.1.2008, 08:05
Цитата(Kozel @  18.1.2008,  20:10 Найти цитируемый пост)
Собтвенно я хочу, чтобы из моей программы выключалась другая по таймеру.


Что известно о другой программе?

Автор: MAKCim 19.1.2008, 11:11
Код

void callback KillTaskRoutine(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
    EndTask(task, FALSE, TRUE);
    KillTimer(NULL, idEvent);
}
...
SetTimer(NULL, NULL, 1000, (TIMERPROC)&KillTaskRoutine);
...

Автор: Kozel 19.1.2008, 11:28
Цитата(W4FhLF @ 19.1.2008,  08:05)
Что известно о другой программе?

Пусть для примера это будет Winamp

Автор: W4FhLF 19.1.2008, 15:48
Цитата(Kozel @  19.1.2008,  11:28 Найти цитируемый пост)
Пусть для примера это будет Winamp


В общем-то MAKCim уже показал суть.
Ну создай дефолтный проект Windows Application в VC++, далее в процедуру WndProc добавь следующий код:

Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
    switch (message)
    {
    case WM_COMMAND:
        ...
    case WM_CREATE: // Сюда внимание обрати. Создание таймера сразу после создания окна приложения.
        SetTimer(NULL, NULL, 1000, (TIMERPROC)&KillTaskRoutine);
        break;
    case WM_DESTROY:
        ...
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


Процедура KillTaskRoutine выглядит следующим обраозом:

Код

BOOL CALLBACK KillTaskRoutine(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
    HANDLE hProcessSnap;
    HANDLE hProcess;
    PROCESSENTRY32 pe32;

    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if( INVALID_HANDLE_VALUE == hProcessSnap )
    {
        MessageBox(hwnd, TEXT( "CreateToolhelp32Snapshot (of processes)\n" ), "Error", MB_OK+MB_ICONERROR);
        return FALSE;
    }

    pe32.dwSize = sizeof( PROCESSENTRY32 );

    if( !Process32First( hProcessSnap, &pe32 ) )
    {
        MessageBox(hwnd, TEXT( "Process32First failed" ), "Error", MB_OK+MB_ICONERROR);
        CloseHandle(hProcessSnap);
        return FALSE;
    }
    

    do
    {
        if (strstr(static_cast<const char*>(pe32.szExeFile), "winamp"))
        {
            hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, pe32.th32ProcessID );
            if( NULL  == hProcess)
                MessageBox(hwnd, TEXT( "OpenProcess failed" ), "Error", MB_OK+MB_ICONERROR);
            else
                TerminateProcess( hProcess, 0 ); // Хотя так убивать приложения неприлично, не бери за правило :)
        }
    } while( Process32Next( hProcessSnap, &pe32 ) );

    KillTimer(NULL, idEvent);
}

Автор: Kozel 19.1.2008, 17:51
Можна в этот код комментов добавить, а то я с winapi еще дел не имел

Автор: W4FhLF 19.1.2008, 18:51
Что именно тебе непонятно? Есть ведь http://msdn2.microsoft.com/en-us/library/default.aspx, там всё описано.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)