Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Запретить любые действия везде


Автор: DemoCode 27.2.2006, 20:43
Какие варианты, есть чтобы сделать так, чтобы, пока пользователь ни сделал определенных действий в моей программе, ни мог больше ничего ничего сделать?

Я блокирую Ctrl+Alt+Del, Alt+Tab, Alt+F4, а также делаю ClipCursor в области моей формы.
Но, проблема в том, что если нажать клавишу Win, далее можно делать что угодно. Как её запретить? А что ещё надо запретить, чтоб лишить пользователя выполнять какие-либо действия?

Под XP

Спасибо.

Автор: Quadr0 27.2.2006, 22:32
...

Автор: DemoCode 28.2.2006, 09:44
Я подпраил твой код:

Код

function KeyboardProc(nCode: Integer; WP: wParam; LP: lParam): integer; stdcall;
begin
  Result := CallNextHookEx(HKbdHook, nCode, WP, LP);
  if nCode = HC_ACTION then
  begin
    if (WP = VK_LWIN) or (WP = VK_RWIN) then
    begin
      SetforeGroundWindow(MFOrm);
      SendMessage(MForm, WM_SETFORE, 0, 0);
    end;
  end;
end;


Но ни работает. При нажатии на Win открывается пуск.

Автор: Romikgy 28.2.2006, 11:46
А через это GetKeyboardState посмотреть его код?

Автор: DemoCode 28.2.2006, 12:23
Цитата(Romikgy @ 28.2.2006, 12:46 Найти цитируемый пост)
А через это GetKeyboardState посмотреть его код?

так тоже пробовал, не работает.

Автор: Romikgy 28.2.2006, 13:02
Цитата(DemoCode @ 28.2.2006, 11:23 Найти цитируемый пост)
так тоже пробовал, не работает.

Эт просто посмотреть , smile а вот если его перехватить и обнулять эту кнопку, типа нажатия не было или keybd_event это перехватить smile я не знаю кто первый вызывается

Автор: DemoCode 28.2.2006, 13:08
Цитата(Romikgy @ 28.2.2006, 14:02 Найти цитируемый пост)
если его перехватить и обнулять эту кнопку, типа нажатия не было или keybd_event это перехватить

В том-то и проблема. У меня получается перехватить любые клавиши, кроме Win.

Автор: bems 28.2.2006, 14:06
Создай свой десктоп и работай там

Автор: Romikgy 28.2.2006, 14:24
Цитата(DemoCode @ 28.2.2006, 12:08 Найти цитируемый пост)
меня получается перехватить любые клавиши

Я те посоветовал не клавиши перехватывать а ф-ции апи, для получения нажатой клавиши

Автор: Rrader 1.3.2006, 11:30
Код

Procedure TForm1.Timer1Timer(Sender: TObject);
Var
  H: THandle;
Begin
  H := FindWindow('DV2ControlHost', NIL);
  If H <> 0 Then SendMessage(H, WM_CLOSE, 0, 0);
  SetForegroundWindow(Handle);
End;

Можно и улучшить - первое, что пришло в голову smile

Автор: xXxFENIKSxXx 17.3.2006, 15:54
Извините нашли ли способ всё таки заблочить
Alt +TAb
Ctrl + Esc
Alt + F4
Windows + d
Особенно саму кнопку Windiws
а то проблема остаёться актуальной.
Только просьба не то что в теории а то что реально работает.
Был бы весьма благодарен.

Автор: Romikgy 17.3.2006, 16:41
xXxFENIKSxXx, берешь и ищешь по форуму

Автор: xXxFENIKSxXx 17.3.2006, 18:33
Цитата(Romikgy @ 17.3.2006, 16:41)
xXxFENIKSxXx, берешь и ищешь по форуму


Нельзя ли ссылочкой плиз
Ты же наверняка знаешь где это лежит smile
а форум большой

Автор: bems 17.3.2006, 19:33
Я ж сказал:
Цитата(bems @ 28.2.2006, 14:06 Найти цитируемый пост)
Создай свой десктоп и работай там
CreateDesktop ну и тд

Автор: xXxFENIKSxXx 18.3.2006, 08:34
А нельзя ли более подробно описать
CreateDesktop

Автор: bems 19.3.2006, 09:29
Цитата(xXxFENIKSxXx @ 18.3.2006, 08:34 Найти цитируемый пост)
А нельзя ли более подробно описать
CreateDesktop
в MSDN

Автор: xXxFENIKSxXx 19.3.2006, 15:02
Блин никак

В поисковике мсдн пишу фразу выдаёт чистый лист (

Автор: HackMan 19.3.2006, 16:54
Кнопка Win отключается через реестр

Автор: MIX55 19.3.2006, 20:56
Цитата

В поисковике мсдн пишу фразу выдаёт чистый лист (

99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь
вот http://msdn.microsoft.com/library/default.asp посмотри


Автор: xXxFENIKSxXx 20.3.2006, 06:27
Цитата(HackMan @ 19.3.2006, 16:54)
Кнопка Win отключается через реестр

а нельзя ли подробнее как это сделать
хотябы указать на запись кнопки пуск в реестре ? smile
Добавлено @ 06:29
Люди а может можно програмно закрыть кнопку пуск )
открыть же её програмно можно вот и скажем самый простой способ когда пользователь будет открывать пуск программа автоматически будет его закрывать ) оформить енто всё через таймер.
Но всё это реально если конечно пуск програмно можно закрыть =)
Добавлено @ 06:30
Цитата(MIX55 @ 19.3.2006, 20:56)
Цитата

В поисковике мсдн пишу фразу выдаёт чистый лист (

99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь
вот http://msdn.microsoft.com/library/default.asp посмотри

Никак smile

Автор: Sunvas 25.3.2006, 08:20
Цитата(xXxFENIKSxXx @ 20.3.2006, 06:27 Найти цитируемый пост)
Люди а может можно програмно закрыть кнопку пуск )

Можно! Только потом трудновато будет ее октрыть!
Код

procedure TForm1.Button1Click(Sender: TObject);
var StartButton:hwnd;
begin
StartButton := FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button', nil);
PostMessage(StartButton,WM_CLOSE,0,0);
end;

Автор: Romikgy 27.3.2006, 09:00
Имхо проще сделать ее невидимой!!!

Автор: Girder 27.3.2006, 10:55
1.Береш вот ентот код: http://forum.vingrad.ru/index.php?showtopic=53442&view=findpost&p=424364

2.добавляеш в него поиск процесса: "csrss.exe" что бы узнать его PID. (PS: Как енто сделать... поиск по форуму smile )

3. Далее находиш вот енту строчку:
Код

     if (Thread32.th32OwnerProcessID<>IgnorePrID) then
и заменяеш ее на(где PID_csrss см. 2 пункт):
Код

     if (Thread32.th32OwnerProcessID<>IgnorePrID)and(Thread32.th32OwnerProcessID<>PID_csrss) then


4. Ну а строчку
Код

Sleep(5000); //Глушим все... на 5 секунд.
можеш заменить для начала на вот енто(Что бы увидеть как енто работает):
Код

   p:=0;
   while (p<>50) do
    begin
     Sleep(100);
     inc(p);
     caption:=inttostr(p);
     Application.ProcessMessages;
    end;

Автор: DemoCode 27.3.2006, 14:16
А может у кого есть готовая оттестированная либа для того, чтобы, пока пользователь ни сделал определенных действий в моей программе, ни мог больше ничего ничего сделать?

Автор: Sunvas 28.3.2006, 00:18
Цитата(Romikgy @ 27.3.2006, 09:00 Найти цитируемый пост)
Имхо проще сделать ее невидимой!!!

Но ведь менюшка по нажатию кнопки Windows останется ведь!

Автор: Romikgy 28.3.2006, 08:50
Цитата(Sunvas @ 27.3.2006, 23:18 Найти цитируемый пост)
по нажатию кнопки Windows

дык заблокируй эту кнопку smile

Автор: hitter 28.3.2006, 20:22
У этой менюшки есть свой хендл ИМХО послать ему WM_CLOSE, WM_QUIT, e.t.c.
Только как получить ентот хендл?
Кнопку лочить невыгодно - хоть убей её, менюшка все равно будет появлятся!

Автор: Sunvas 29.3.2006, 00:43
Цитата(hitter @ 28.3.2006, 20:22 Найти цитируемый пост)
Только как получить ентот хендл?



hitter, нужно читать тему внимательней!
Код

FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button', nil);


Цитата(hitter @ 28.3.2006, 20:22 Найти цитируемый пост)
Кнопку лочить невыгодно - хоть убей её, менюшка все равно будет появлятся!

Но когда я ее закрываю, то уже ничего не поможет, разве что оболочку перегрузить.

Цитата(Romikgy @ 28.3.2006, 08:50 Найти цитируемый пост)
дык заблокируй эту кнопку

А если я на клавиатуре нажму кнопку Windows, то менюшка появится!

Автор: hitter 29.3.2006, 07:18
Цитата(Sunvas @ 29.3.2006, 04:43 Найти цитируемый пост)
hitter, нужно читать тему внимательней!

ОК smile smile smile

Цитата(Sunvas @ 29.3.2006, 04:43 Найти цитируемый пост)
А если я на клавиатуре нажму кнопку Windows, то менюшка появится!

Ладно тогда надо лочить кнопу.


Цитата(Girder @ 27.3.2006, 14:55 Найти цитируемый пост)
1.Береш вот ентот код: http://forum.vingrad.ru/index.php?showtopi...st&p=424364

2.добавляеш в него поиск процесса: "csrss.exe" что бы узнать его PID. (PS: Как енто сделать... поиск по форуму  )

3. Далее находиш вот енту строчку: 
Код

  if (Thread32.th32OwnerProcessID<>IgnorePrID) then    
и заменяеш ее на(где PID_csrss см. 2 пункт):    
 if (Thread32.th32OwnerProcessID<>IgnorePrID)and(Thread32.th32OwnerProcessID<>PID_csrss) then    



4. Ну а строчку
код
Код

Sleep(5000); //Глушим все... на 5 секунд.

можеш заменить для начала на вот енто(Что бы увидеть как енто работает):
код Pascal/Delphi

5.
Код

   p:=0;    
   while (p<>50) do    
    begin    
     Sleep(100);    
     inc(p);    
     caption:=inttostr(p);    
     Application.ProcessMessages;    
    end;

А что этим ни кто не воспользовался?

Автор: Sunvas 30.3.2006, 00:11
Цитата(hitter @ 29.3.2006, 07:18 Найти цитируемый пост)
А что этим ни кто не воспользовался?

Наверное потому что это слишком уж запутано.. Да и в ограниченой учетной записи не работает..

Автор: Rrader 30.3.2006, 07:08
Цитата

hitter, нужно читать тему внимательней!
FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button', nil);

Это не хендл менюшки. Посмотрите мой пост в этой теме, там я показал, как определить нужный хендл smile

Автор: hitter 30.3.2006, 07:13
Цитата(Sunvas @ 30.3.2006, 04:11 Найти цитируемый пост)
Наверное потому что это слишком уж запутано..

Для кого-то даже сорцы тетриса запутанны smile smile


Цитата(Sunvas @ 30.3.2006, 04:11 Найти цитируемый пост)
Да и в ограниченой учетной записи не работает..

А запустить код в контексте другого пользователя?


Автор: Sunvas 5.4.2006, 14:50
Цитата(Rrader @ 30.3.2006, 07:08 Найти цитируемый пост)
Это не хендл менюшки. Посмотрите мой пост в этой теме, там я показал, как определить нужный хендл 

Хе-хе! Но ведь кнопочка-то закрывается! Значит хендл есть!

Цитата(hitter @ 30.3.2006, 07:13 Найти цитируемый пост)
Для кого-то даже сорцы тетриса запутанны 

Да, да! Есть и такие люди! smile



Цитата(hitter @ 30.3.2006, 07:13 Найти цитируемый пост)
А запустить код в контексте другого пользователя?

А если у меня есть только ограниченая? (я не знаю пароль другого пользователя)

Автор: hitter 5.4.2006, 16:38
Цитата(Sunvas @ 5.4.2006, 18:50 Найти цитируемый пост)
А если у меня есть только ограниченая? (я не знаю пароль другого пользователя)

Надо узнать! smile smile

Автор: Sunvas 6.4.2006, 07:15
Цитата(hitter @ 5.4.2006, 16:38 Найти цитируемый пост)
А если у меня есть только ограниченая? (я не знаю пароль другого пользователя)

Надо узнать! 

Будут идеи как это быстро сделать, если пароль состоит где-то из 20-25 символов - пиши в ПМ!


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