Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/23: Рейтинг темы: голосов - 23, средняя оценка - 4.91
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

Где почитать инструкции о том как выдвинуть окно запущенного процесса на передний план

14.04.2021, 16:56. Показов 5111. Ответов 38

Студворк — интернет-сервис помощи студентам
Хочу узнать все аспекты которые нужно проделать чтобы выдвинуть на передний план, инструкций ни видел нигде а все функции которые нашёл не работают.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.04.2021, 16:56
Ответы с готовыми решениями:

Как выдвинуть окно экселя на передний план?
?

Как выдвинуть свою программу на передний план?
Как выдвинуть свою программу на передний план? По верх всех окон!

Как перенести на передний план окно с приложением?
Добрый день! В WinXP одна программа запускает другую, и окно последней, с GUI, появляется не всегда. Если запустить после этого Process...

38
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
27.04.2021, 05:47  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от WhiteP Посмотреть сообщение
и делать SetForegroundWindow
А почему здесь https://www.cyberforum.ru/post15447431.html notepad получается искажённый и ложится поверх всех окон, но правда я там использую SetWindowPos, у него же нету дочерних процессов.
Я про дочерние процессы открывал тему Покажите пример дочерних и унаследованных процессов и видимо не зря. Всё равно очень много странностей. если я запускаю процесс через CreateProcess значит у меня есть прямой доступ к pid а с помощью EnumWindows я могу найти окно, но это не всегда работает. Привидите пример с кодом как вы выше написали запустите браузер, установите задержку, спрячьте его на задний план и посмотрите как функция выведет его поверх всех окон.

Добавлено через 23 секунды
Одновременно сообщения написали.

Добавлено через 22 минуты
Цитата Сообщение от WhiteP Посмотреть сообщение
Обычно - последний в раскрытом списке всех PID Firefox
1ый, последние дочерние. У меня в диспетчере нет этой информации. Я в cmd ввёл tasklist и вбивал Pid в вашу прогу.

Добавлено через 5 минут
Упоминается что-то про стили WS_VISIBLE в функции IsWindowVisible https://docs.microsoft.com/en-... dowvisible

Добавлено через 4 часа 26 минут
Цитата Сообщение от WhiteP Посмотреть сообщение
if (GetWindow(hwnd, GW_OWNER) == (HWND)0 && IsWindowVisible(hwnd))
зачем вы их вызываете я и так уверен что окна открыты процесс же запустился и зачем столько таймеров?

Добавлено через 13 минут
Цитата Сообщение от WhiteP Посмотреть сообщение
Можешь проверить, написав программу, которая выдвигает окно при ручном вводе PID
А как сделать чтобы не при ручном вводе я же не буду руками их туда вводить всё время?
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
27.04.2021, 08:37
Цитата Сообщение от Nexi99 Посмотреть сообщение
А почему здесь https://www.cyberforum.ru/post15447431.html notepad получается искажённый
C
1
2
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_SIZEBOX);
SetWindowLongPtr(g_HWND,GWL_STYLE, lStyle);
Ты же сам выключаешь у окна строку заголовка, рамку, системное меню и сайзбокс.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Всё равно очень много странностей. если я запускаю процесс через CreateProcess значит у меня есть прямой доступ к pid а с помощью EnumWindows я могу найти окно, но это не всегда работает.
Есть прямой доступ к PID того процесса, который был создан функцией CreateProcess. Но для Firefox (и других) - ручной вызов (как и вызов CreateProcess) - это по сути вызов Firefox в режиме лоадера. Он просто порождает новые процессы с некоторыми параметрами и закрывается. В итоге у тебя есть PID процесса , который уже отработал и закрылся.
Цитата Сообщение от Nexi99 Посмотреть сообщение
Привидите пример с кодом как вы выше написали запустите браузер, установите задержку, спрячьте его на задний план и посмотрите как функция выведет его поверх всех окон.
В том приложении что выложил - по таймеру каждые 3 секунды окно разворачивается на весь экран и выдвигается на передний план. В т.ч. и Firefox, если выбрать правильный PID.
Цитата Сообщение от Nexi99 Посмотреть сообщение
У меня в диспетчере нет этой информации
В диспетчере на вкладке "Процессы" правой кнопкой по заголовку колонок. Там галочки.
Цитата Сообщение от Nexi99 Посмотреть сообщение
зачем вы их вызываете я и так уверен что окна открыты процесс же запустился
Это проверка на то, что окно не дочернее и видимое на экране. Именно такие окна обычно главные у приложения. Если не проверять каждое, то окон, принадлежащих процессу, может быть десятки.
Цитата Сообщение от Nexi99 Посмотреть сообщение
и зачем столько таймеров?
Таймер при одном добавленном PID с окном - всего один, вызывается каждые 3 секунды и двигает окно. В консоли сообщение для отладки.
Цитата Сообщение от Nexi99 Посмотреть сообщение
А как сделать чтобы не при ручном вводе я же не буду руками их туда вводить всё время?
Нужно найти все PID, дочерние для твоего процесса и, возможно, дочерние для дочерних. И для них также найти главные окна и двигать. Возможно, достаточно найти дочерний процесс, созданный последним, нужно проверять.
Найти все дочерние PID виду несколько вариантов:
1. CreateToolhelp32Snapshot /Process32First. Делать снэпшот и выстраивать иерархию по данным в структуре PROCESSENTRY32, а именно поле th32ParentProcessID.
2. Похожий вариант - находить по PID путь к образу исполняемого файла и строить иерархию по времени создания процесса. Скорее всего последний созданный и есть нужный.
3. Разбираться с Nested Jobs и ловить в IO порт сообщение о создании нового процесса в задании.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
27.04.2021, 16:59  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
CreateProcess) - это по сути вызов Firefox в режиме лоадера. Он просто порождает новые процессы с некоторыми параметрами и закрывается. В итоге у тебя есть PID процесса , который уже отработал и закрылся.
Как вы пришли к такому выводу, я заметил что пид/PID эта функция выдаёт правильный, я вызывал команду tasklist и сравнивал, но вы пишите что он отработан и нужно искать другой в иерархическом дереве но при ручном вводе он срабатывает, защита какае-та или что? Странно и то что никто из пользователей об этом не написал.
Цитата Сообщение от WhiteP Посмотреть сообщение
Ты же сам выключаешь у окна строку заголовка, рамку, системное меню и сайзбокс.
Уже начинаю всё подряд пихать в компилятор и проверять, советуют блин и не знают сами как это работает, там куча флагов я и понятия не имею зачем они спрашивал но тоже ребята не очень, зато надо мной можно шутить.
Цитата Сообщение от WhiteP Посмотреть сообщение
1. CreateToolhelp32Snapshot /Process32First. Делать снэпшот и выстраивать иерархию по данным в структуре PROCESSENTRY32, а именно поле th32ParentProcessID.
Тестировал находит какие-то другие Pid которые не всегда совпадают с CreateProcess, я естественно не фига не понял и бросил затею оказывается это довольно трудоёмкая задача.
У меня вчера перестали работать
C++
1
2
GetExitCodeProcess(proc_info.hProcess,&ExitCode);
TerminateProcess(proc_info.hProcess,ExitCode);
на Мозиле, хотя ранее всё было нормально, на остальных прогах работает, буду портить пока их чёрт с ним.
Возникает ещё вопрос а почему по Pid от CreateProcess моя EnumWindows находит правильный дескриптор окна, я проверял этот дескриптор в Spy++ 64 он совпадает но при этом управление всё же теряется, может это связано с тем что Хэндл ещё продолжает действовать поэтому и окно находит?
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
27.04.2021, 18:10
Цитата Сообщение от Nexi99 Посмотреть сообщение
Как вы пришли к такому выводу, я заметил что пид/PID эта функция выдаёт правильный
Провел эксперимент, как же ещё. Сравнил тот PID, что возвращает CreateProcess с теми, что есть в диспетчере задач у активного Firefox - совпадений нет. Открыл Procmon и убедился, что первичный процесс, PID которого возвращает CreateProcess, живет меньше секунды. Пример вывода Procmon во вложении (9256 - PID проводника).

Цитата Сообщение от Nexi99 Посмотреть сообщение
но вы пишите что он отработан и нужно искать другой в иерархическом дереве но при ручном вводе он срабатывает, защита какае-та или что?
Да никакой защиты там нет. Тот PID, что возвращает CreateProcess != тому, что ты вбиваешь вручную.
Цитата Сообщение от Nexi99 Посмотреть сообщение
куча флагов я и понятия не имею зачем они
В MSDN каждый флаг описан вполне доходчиво. Научись работать с документацией, без этого никуда.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Тестировал находит какие-то другие Pid которые не всегда совпадают с CreateProcess, я естественно не фига не понял и бросил затею оказывается это довольно трудоёмкая задача.
Вот именно эти не совпадающие с CreateProcess и нужны. Родительский PID можно найти в PROCESSENTRY32, я уже об этом писал ранее. Так иерархию и строить, т.к. как такового механизма иерархии в Windows нет.
Цитата Сообщение от Nexi99 Посмотреть сообщение
дескриптор в Spy++ 64 он совпадает но при этом управление всё же теряется, может это связано с тем что Хэндл ещё продолжает действовать поэтому и окно находит?
В Spy++ не проверял. Мне достаточно тех данных, что я получил. К тому же экспериментально с ручным вбиванием PID - инфа полностью подтверждается.
Миниатюры
Где почитать инструкции о том как выдвинуть окно запущенного процесса на передний план  
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
27.04.2021, 18:39  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Вот именно эти не совпадающие с CreateProcess и нужны.
Это могут быть и потоки а не процессы, я не знаю отображаются ли потоки там где отображаются Pid, есть специальный функции для этих случаев, я понятное дело в этом опыта не имею.
А у меня совпадает вот скрины.
Миниатюры
Где почитать инструкции о том как выдвинуть окно запущенного процесса на передний план   Где почитать инструкции о том как выдвинуть окно запущенного процесса на передний план  
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
27.04.2021, 18:41  [ТС]
Но с Мозилой что-то не то. Ну а тот способ что вы написали даёт другие Pid если по имени процесса искать, короче это очень странно.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
27.04.2021, 20:31
Попробуй это. На chrome, firefox и паре других приложений работает.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <windows.h>
#include <psapi.h>
#include <conio.h>
#include <tlhelp32.h>
 
HANDLE hTimer;
HANDLE hTimerQueue;
DWORD count;
DWORD g_cppid;
 
typedef struct _pidHwnd
{
    HWND hWnd;
    DWORD pid;
}hwndPid;
 
hwndPid list[64];
 
VOID CALLBACK TimerRoutine(PVOID lparam, BOOL TimerOrWaitFired)
{
    ShowWindow(list[(int)lparam].hWnd, SW_MAXIMIZE);
    SetForegroundWindow(list[(int)lparam].hWnd);
    printf("Timer for PID %d, HWND is %d\n", (int)list[(int)lparam].pid, (int)list[(int)lparam].hWnd);
}
 
BOOL CALLBACK EnumWindowsProc(_In_ HWND   hwnd, _In_ LPARAM lParam)
{
    DWORD pid = 0;
 
    if (GetWindow(hwnd, GW_OWNER) == (HWND)0 && IsWindowVisible(hwnd))
    {
        GetWindowThreadProcessId(hwnd, &pid);
        if (pid == (DWORD)lParam)
        {
            list[count].pid = pid;
            list[count].hWnd = hwnd;
 
            hTimerQueue = CreateTimerQueue();
            CreateTimerQueueTimer(&hTimer, hTimerQueue, (WAITORTIMERCALLBACK)&TimerRoutine, (PVOID)count, 10, 3000, 0);
 
            count++;
            return FALSE;
        }
    }
    return TRUE;
}
 
BOOL FindAllInstances(CHAR * path)
{
    Sleep(1000);
 
    PROCESSENTRY32 pe32;
    pe32.dwSize = { sizeof(pe32) };
 
    CHAR path2[MAX_PATH];
 
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    Process32First(hSnap, &pe32);
 
    do
    {
        HANDLE hProc2 = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe32.th32ProcessID);
        GetModuleFileNameExA(hProc2, NULL, path2, MAX_PATH);
        CloseHandle(hProc2);
 
        if (!strcmp(path, path2))
        {
            if (pe32.th32ProcessID != g_cppid)
                printf("PID with same filepath : %d\n", pe32.th32ProcessID);
            EnumWindows(EnumWindowsProc, (LPARAM)pe32.th32ProcessID);
        }
    } while (Process32Next(hSnap, &pe32));
 
    CloseHandle(hSnap);
    return TRUE;
}
 
int main(int argc, char** argv)
{
    OPENFILENAMEA ofn;
    char szFile[MAX_PATH];
 
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "Executable files\0*.exe\0";
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    if (GetOpenFileNameA(&ofn) == TRUE)
    {
        STARTUPINFOA si = { sizeof(si) };
        PROCESS_INFORMATION pi;
 
        CreateProcessA(szFile, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
        printf("PID from CreateProcess: %d\n", pi.dwProcessId);
        g_cppid = pi.dwProcessId;
 
        WaitForInputIdle(pi.hProcess, INFINITE);
 
        FindAllInstances(szFile);
 
        _getch();
 
        DeleteTimerQueueTimer(hTimerQueue, hTimer, NULL);
        DeleteTimerQueue(hTimerQueue);
 
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }
    return 0;
}
1
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.04.2021, 04:55  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Попробуй это
Я хочу определить имя процесса на основании открытого окна, видел что есть такие функции даже на этом форуме но не сохранил ссылку?
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.04.2021, 22:14  [ТС]
Прошу прощение ребята вопрос снимается, с помощью GetWindowThreadProcessId можно получить номер потока и Pid процесса, т.е. по сути мы уже владеем этой информацией.
1
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
02.05.2021, 21:31  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
OpenProcess
Пытаюсь получить Хэндл процесса этой функцией
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#define ret return
#define en endl
char*put="C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe";
 
STARTUPINFOA start_info={sizeof start_info};//
PROCESS_INFORMATION proc_info={0};//
CreateProcessA(put,0,0,0,0,0,0,0,&start_info,&proc_info);//proc_info.dwProcessId/
Sleep(20000);
 
HANDLE Process_[4]={CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)};///TH32CS_SNAPALL
PROCESSENTRY32 pe32pr={};pe32pr.dwSize=sizeof(pe32pr);
if(Process32FirstW(Process_[0],&pe32pr)){
if(!_tcscmp(pe32pr.szExeFile,TEXT("brave.exe"))){
cout<<"процесс "<<pe32pr.th32ProcessID<<en;}
else
for(;Process32NextW(Process_[0],&pe32pr);){
if(!_tcscmp(pe32pr.szExeFile,TEXT("brave.exe"))){
cout<<"процесс "<<pe32pr.th32ProcessID<<en;break;}
}
}
 
Process_[1]=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pe32pr.th32ProcessID);
THREADENTRY32 pe32pt={};pe32pt.dwSize=sizeof(pe32pt);
if(Thread32First(Process_[1],&pe32pt)){
if(pe32pt.th32OwnerProcessID==pe32pr.th32ProcessID){
cout<<"поток "<<pe32pt.th32ThreadID<<en;}
else
for(;Thread32Next(Process_[1],&pe32pt);){
if(pe32pt.th32OwnerProcessID==pe32pr.th32ProcessID){
cout<<"поток "<<pe32pt.th32ThreadID<<en;break;}
}
}
 
Process_[2]=CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,0);//pe32pr.th32ProcessID
HEAPLIST32 he32k={};he32k.dwSize=sizeof(he32k);
if(Heap32ListFirst(Process_[2],&he32k)){if(he32k.th32ProcessID==pe32pr.th32ParentProcessID){
cout<<"номер блока/кучи "<<he32k.th32HeapID<<en;}
else
for(;Heap32ListNext(Process_[2],&he32k);){
if(he32k.th32ProcessID==pe32pr.th32ParentProcessID){//he32k
cout<<"номер блока/кучи "<<he32k.th32HeapID<<en;break;
}}
}
 
HEAPENTRY32 he32h={};he32h.dwSize=sizeof(he32h);
if(Heap32First(&he32h,pe32pr.th32ParentProcessID,he32k.th32HeapID)){//pe32pr.th32ParentProcessID/
if(he32h.th32ProcessID==pe32pr.th32ParentProcessID){
cout<<"Дескриптор "<<he32h.hHandle<<en;}
else
for(;Heap32Next(&he32h);){
if(he32h.th32ProcessID==pe32pr.th32ParentProcessID){
cout<<"Дескриптор "<<he32h.hHandle<<en;break;
}}
}
 
Process_[3]=OpenProcess(0,1,pe32pr.th32ProcessID);//выдаёт 0
Никаких супер бупер прав доступа я не требую от него просто дескриптор. Может нужно по другому вызвать CreateProcessA. Последние 2 блока находят кучу и Хэндл но он там какой-то левый либо нашёл не правильно.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
03.05.2021, 08:18
Цитата Сообщение от Nexi99 Посмотреть сообщение
OpenProcess(0,1,pe32pr.th32ProcessID);
Первый аргумент 0 - это зачем? Наследовать дескрипторы (второй аргумент) - действительно нужно?
GetLastError хотя бы после вызова "сбоящей" функции вызови.

C
1
2
3
4
5
HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
03.05.2021, 21:39  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Первый аргумент 0 - это зачем?
В иструкции майкрософт указано что это умолчательные права доступа которые были даны CreateProcessA

Добавлено через 3 минуты
Цитата Сообщение от WhiteP Посмотреть сообщение
GetLastError хотя бы после вызова "сбоящей" функции вызови.
C++
1
2
3
4
5
6
7
8
Process_[3]=OpenProcess(PROCESS_TERMINATE,0,pe32pr.th32ProcessID);
cout<<"Process_[3] "<<Process_[3]<<en;
DWORD exit_=0;
GetExitCodeProcess(Process_[3],&exit_);
cout<<"exit_ "<<exit_<<" GetLastError "<<GetLastError()<<en;
TerminateProcess(Process_[3],exit_);
CloseHandle(Process_[3]);
cout<<"закрыли GetLastError "<<GetLastError()<<en;
Код ошибки 5, читал что это говорит о запрещённом доступе, это меня не удивляет но и решить проблему я не могу потому что как эти доступы и привелегии менять не знаю, какой порядок нужно выполнить чтобы это прокрутить тоже не знаю хотелось бы простых человеческих примеров.
Но процесс завершается, я не знаю насколько это опасно, поэтому я не вызываю GetLastError, потому что в нормальном коде он не нужен

Добавлено через 1 минуту
а в том коде который отлаживается он нужен, но как я и писал выше что с этой ошибкой делать я без понятия.

Добавлено через 35 минут
Цитата Сообщение от WhiteP Посмотреть сообщение
HANDLE OpenProcess(
C++
1
2
3
4
5
6
7
8
Process_[3]=OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe32pr.th32ProcessID);
cout<<"Process_[3] "<<Process_[3]<<en;
DWORD exit_=0;
GetExitCodeProcess(Process_[3],&exit_);
cout<<"exit_ "<<exit_<<" GetLastError "<<GetLastError()<<en;
TerminateProcess(Process_[3],exit_);
CloseHandle(Process_[3]);
cout<<"закрыли GetLastError "<<GetLastError()<<en;
Процесс не завершается хоть и находит какой-то хэндл.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
04.05.2021, 09:03
Nexi99, по умолчанию права не всегда те, которые нужны.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
04.05.2021, 21:36  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
по умолчанию права не всегда те, которые нужны.
может можно взять другой CreateProcessA, там же есть запуск от имени пользователя, но тут и другая проблема Pid теряется я уже в этом убедился.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.05.2021, 21:10
Цитата Сообщение от Nexi99 Посмотреть сообщение
я не вызываю GetLastError, потому что в нормальном коде он не нужен
В нормальном коде GetLastError() никогда не помешает, но не всегда это повод беспокоить пользователя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <sdkddkver.h>
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include <string>
 
 
DWORD 
ReportError() {
    
    auto error{ GetLastError(), };
    TCHAR message[01000]{0};
 
    auto formatted = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0,
        error,
        0, // LangID
        message, ( sizeof message ) / sizeof message[0],
        0);
 
    _tprintf(TEXT("%s\n"),
        message);
        //<< std::endl;
 
    return formatted;
 
}
 
int 
_tmain()
{
    _tsetlocale(LC_ALL, TEXT(""));
 
#pragma comment ( lib, "advapi32.lib")
 
    auto token{
        GetCurrentProcessToken(),
    };
    ReportError();
 
    TOKEN_PRIVILEGES p[0200];
    DWORD length{};
    auto gotTI{
        GetTokenInformation(token,
            TokenPrivileges,
            p, sizeof p,
            &length),
    };
    ReportError();
 
    if (gotTI) {
        for (DWORD ip{ 0 }; ip != p[0].PrivilegeCount; ++ip) {
            std::cout
                << p[0].Privileges[ip].Attributes;
 
            TCHAR Name[0100]{};
            DWORD cchName = { _countof(Name) };
            if (LookupPrivilegeName(0,
                &p[0].Privileges[ip].Luid,
                Name, &cchName)
                )
            {
                std::wcout << ':' << Name;
            }
            else
                ReportError();
            std::cout << std::endl;
        }
    }
 
    auto pid{ GetCurrentProcessId(), };
    std::cerr << pid
        << std::endl;
 
 
    auto handle{ OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 1, pid), };
    ReportError();
    std::cerr 
        << handle
        << '\n';
 
    auto handleTQ{ OpenProcess( 0
        | PROCESS_QUERY_LIMITED_INFORMATION
        | PROCESS_TERMINATE, 
        1, pid), };
    ReportError();
    std::cerr 
        << handleTQ
        << '\n';
 
    auto handleDefault{ OpenProcess(0, 1, pid), };
    ReportError();
    std::cerr << handleDefault
        << '\n';
 
    std::cerr << token
                << std::endl;
 
    int RC{};
    std::cin >> RC;
    TerminateProcess(handleTQ, RC);
    ReportError();
 
}
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
05.05.2021, 21:44  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
В нормальном коде GetLastError() никогда не помешает
если подразумевается проверка ошибки значит подразумевается её лечение либо принятие других мер, если ошибка не проверяется значит код работает правильно.
Например что делать с ошибкой 5ть, ответ ничего. Возникает вопрос зачем же её проверять и увиличивать объём кода программы который не несёт пользы. Полезно только в отладке.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.05.2021, 09:23
GetExitCodeProcess() , TerminateProcess() и т.д. может установить ненулевой SetLastError() по независящим причинам от корректного кода, который их пытается вызвать.
Например, процесс уже корректно завершился "сам" с помощью ExitProcess(), процесс завершила другая программа с помощью TerminateProcess(), система завершила работу, один из потоков процесса находится в состоянии, которое невозможно прервать в обозримое время, в очередном обновлении исправлена ошибка в системной программе, из-за которой раньше операция "выполнялась" успешно, хотя не должна была и т.п.

Если не проверять результаты работы функций, то программа иногда будет работать, иногда не будет, и Вы об этом, возможно, даже не узнаете, если программа выполняется без присмотра оператора.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
09.05.2021, 20:28  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Если не проверять результаты работы функций, то программа иногда будет работать, иногда не будет, и Вы об этом, возможно, даже не узнаете, если программа выполняется без присмотра оператора.
Но в любом случае должны выполнятся критерии:
1. Программист должен знать природу ошибки и конечно устранить её. В моём случае даже нулевая ошибка не помогла решить проблему пока один из пользователь не написал что процесс умирает и как оказалось не только он.
2. Программист должен проверить правильность своего кода и выпустить программу тогда когда она полностью стабильна, если она стабильна использование поиска ошибки ничего не меняет.
Получается замкнутый цикл, если ошибка есть, программа не стабильна, если её нет код работает нормально и в любом случае нагрузка ложится на программиста разработчика и голова болит у него а не у тех кто нахимичил чёрт знает что. У меня коды либо работаю либо нет, 3ьего варианта такого как GetLastError у меня просто не существует, ещё не разу за 6 лет он мне не помог.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
06.06.2021, 02:30  [ТС]
Лучший ответ Сообщение было отмечено politoto как решение

Решение

Цитата Сообщение от WhiteP Посмотреть сообщение
Вот именно эти не совпадающие с CreateProcess и нужны. Родительский PID можно найти в PROCESSENTRY32, я уже об этом писал ранее. Так иерархию и строить, т.к. как такового механизма иерархии в Windows нет.
В общем довольно трудоёмко. Решил проблему так https://www.cyberforum.ru/blog... g7148.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2021, 02:30

Как вывести главное окно приложения на передний план
Всем здравствуйте. На форму помещён таймер. Если приложение свёрнуто на панель задач, то по истечению интервала таймера происходит...

Как сделать окно активным и вывести его на передний план
В скрпте создается окно Internet explorer (методом CreateObject(&quot;InternetExplorer.Application&quot;)). Далее неоходимо сделать это окно активным...

Как максимизировать чужое окно без вывода его на передний план?
Есть окно 1, оно свернуто в значок на панели задач. Есть окно 2, которое максимизировано, активно и находится на переднем плане. Нужно,...

Окно на передний план
Как сделать чтобы программа под названием например &quot;Калькулятор Плюс&quot; перед которой открыто оно, выходило на передний план?

Окно на передний план
Доброго времени суток. Подскажите, пожалуйста, как в tkinter переводить окно на передний план. По сути вот код:import tkinter from...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru