Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как повесить процесс ???? поменять состояние на "ВИСИТ" 
V
    Опции темы
Syberex
Дата 19.4.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



я изучаю поведение процессов и потоков , и вот возникла необходимость поменять состояние программы на (висит,не висит(ну та что уже висит на не висит)) ну чтоб диспечер задач видел и отображал , что программа не отвечает , как это сделать, хендл главного окна могу получить а дальше как? Функция IsHungAppWindow(hWnd) показывает висит или нет, мож есть на подобе чтоб поменять состояние??? пишу на Borland Developer Studio 2006 c++ 

Это сообщение отредактировал(а) Syberex - 19.4.2007, 15:44
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
_hunter
Дата 19.4.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



есть способ -- нужно тупо не обрабатывать (не вызывать PeekMessage) приходящие сообщения.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Syberex
Дата 19.4.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



а пример кода есть?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
_hunter
Дата 19.4.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



if (!hangup)
PeekMessage(...);
как-то так (это если приложение твое)
если не твое -- придется оконную процедуру подменять...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Syberex
Дата 20.4.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



Код

MSG *PMSG;
HWND hWnd = FindWindow(NULL, _T("Калькулятор"));

PeekMessage(PMSG,hWnd,0,0,PM_NOREMOVE);


на подобе такого? но как поменять , чё то не получается???? программа не моя, хочу "повесить"  калькулятор.

Это сообщение отредактировал(а) Syberex - 20.4.2007, 08:02
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
ama_kid
Дата 20.4.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Syberex
Цитата
программа не моя, хочу "повесить"  калькулятор.
Вот тебе цитата из МСДН (если ты не поверил _hunter'у):
Цитата
PeekMessage does not retrieve messages for windows that belong to OTHER threads.
Могу дать совет - вешай глобальный хук с помощью SetWindowsHookEx на  WH_GETMESSAGE и отлавливай сообщения себе на здоровье. Для заданного окна (Калькулятор) - просто не отдавай ему сообщения (отдавай только WM_CLOSE, если хочешь, чтобы была возможность его закрыть). За подробностями - милости прошу по ссылкам или в поиск...

_hunter
Цитата
если не твое -- придется оконную процедуру подменять...
Мне кажется, так просто не прокатит, ибо сказано в священном писании:
Цитата
GWL_WNDPROC
Sets a new address for the window procedure.
Windows NT/2000/XP: You cannot change this attribute if the window does not belong to the same process as the calling thread.
Или как-то все-таки можно? Очень интересно было бы узнать (хотя бы направление)...  smile 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
_hunter
Дата 20.4.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



Цитата(ama_kid @  20.4.2007,  10:18 Найти цитируемый пост)
Или как-то все-таки можно? Очень интересно было бы узнать (хотя бы направление)...

это делается путем внедрения в чужой процесс своего кода...
в принципе такие темы уже поднимались:
http://forum.vingrad.ru/topic-108238.html


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
ama_kid
Дата 20.4.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



_hunter
А... ну я понял, я просто подумал о подмене без внедрения кода... Де-факто, мы говорим об одном и том же...  smile 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Syberex
Дата 20.4.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



а реальный пример кода  у когото есть, ну чтоб поюзать можно было smile ? я не хочу внедряться свой код в чёжой процесс, я просто хочу чтоб винда видела состояние например калькулятора как будто он висит(а на сомом деле он чёдестно работает).

Это сообщение отредактировал(а) Syberex - 20.4.2007, 11:45
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
_hunter
Дата 20.4.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



Цитата(Syberex @  20.4.2007,  11:40 Найти цитируемый пост)
я просто хочу чтоб винда видела состояние например калькулятора как будто он висит(а на сомом деле он чёдестно работает).

а это вообще маловероятно...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Syberex
Дата 20.4.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



там что мне делать?? как же быть, ну как же тогда просто повесить реально его, испортить его код в памяти что-ли, ну так он закроется  smile , а  я хочу чтоб висел  smile 
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
_hunter
Дата 20.4.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



я же сказал -- подменяй оконную процедуру. или хук вешай (как ama_kid советовал) и не пропускай сообщения к этому окну.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
dumb
Дата 20.4.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



бред какой, пардон. не подобралось другого слова...
для реализации этого бреда нужно перехватить IsHungAppWindow и на нужный процесс возвращать статус "висящего"...
PM MAIL   Вверх
Syberex
Дата 20.4.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(dumb @ 20.4.2007,  12:25)
бред какой, пардон. не подобралось другого слова...
для реализации этого бреда нужно перехватить IsHungAppWindow и на нужный процесс возвращать статус "висящего"...

и как сделать? дай примерчик  smile 
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
W4FhLF
Дата 20.4.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Никакого перехвата и хуков не надо, проявите фантазиюsmile Я вижу по-меньшей мере 3 способа без всяких хуков, самый простой:

Код

#include <iostream>
#include <windows.h>


extern "C" {
    typedef HANDLE (__stdcall *OpenThread)(DWORD, BOOL, DWORD);
}

void EnableDebugPrivilege(bool fEnable)
{ 
 HANDLE hToken; 
 if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
 { 
  TOKEN_PRIVILEGES tp; 
  tp.PrivilegeCount = 1; 
  LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); 
  tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; 
  AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, NULL); 
  CloseHandle(hToken); 
 } 
}

int main(int argc, char* argv[]) 
{
    HMODULE hModule = GetModuleHandle("kernel32.dll");
    OpenThread pOpenThread = (OpenThread)GetProcAddress(hModule, "OpenThread");


    CONTEXT cnx = {0};
    char shellcode[] = "\xEB\xFE";
    HWND hWnd = FindWindow(NULL, "Калькулятор");
    if (hWnd != 0) {
        DWORD ProcessID; 
        DWORD ThreadID = GetWindowThreadProcessId(hWnd, &ProcessID);
        PVOID hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
        if (hProcess > ERROR_SUCCESS) {
            PVOID pMemory = VirtualAllocEx(hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
            DWORD pBytes = 0;
            WriteProcessMemory(hProcess, pMemory, &shellcode, 2, &pBytes);
            if (pBytes) {
                cnx.ContextFlags = CONTEXT_FULL;
                PVOID hThread = pOpenThread(THREAD_ALL_ACCESS, FALSE, (DWORD)ThreadID);
                EnableDebugPrivilege(TRUE);
                SuspendThread(hThread);
                GetThreadContext((PVOID)hThread, &cnx);
                cnx.Eip = (DWORD)pMemory;
                SetThreadContext((PVOID)hThread, &cnx);
                ResumeThread(hThread);
            }
            
        }
    }

    char ch;
    std::cin >> ch;
    return 0; 
}



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.