Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Хочу, чтобы программа не сварачивалась!?


Автор: Nicholas 16.10.2004, 12:31
При нажатии Windows+D прграмма сварачивается, а как это устранить????

sample.gif

Автор: Alkash 16.10.2004, 12:45
Отловить нажатия клавишь, и по их нажатию не давать свернуться.

Автор: Alex 16.10.2004, 13:50
Цитата(Nicholas @ 16.10.2004, 13:31)
При нажатии Windows+D прграмма сварачивается, а как это устранить????

Тебе только по нажатию комбинации нужно или что бы вообще не сворачивалась?

Автор: decoder 16.10.2004, 17:21
Если Виндовз+Ды из ряда Альт+Ф4, то одним хуком тут не обойтись... В смысле, если хуку на Альт+Ф4 написать "резалт = 1", то пофиг Альт+Ф4 проскочит. Парадоксальный способ: MessageBox поставить - управление не возвращает, пока ОК не нажмёшь (это если комбинацию клавиш оконная функция не отлавливает, иначе придётся ещё и оконную функцию модифицировать...) - Альт+Ф4 из системной очереди сообщений просто исчезает!

Автор: Nicholas 18.10.2004, 07:07
Цитата(Alex @ 16.10.2004, 13:50)
Тебе только по нажатию комбинации нужно или что бы вообще не сворачивалась?



Хотелось бы оба варианта увидеть, или хоть по по нажатию как???
:sample

Автор: Snowy 18.10.2004, 08:14
IMHO долхлый номер. Win+D не победить. Работает всегда. Если только в реестре запретить Win комбинации и перезагрузить систему.

Автор: imageman 18.10.2004, 11:07
а если попробовать следить за состоянием окна? Координаты, видимость.

А если после Win-D свое окно минимазировать и опять восстановить?

Только что проверил на одной старой программе - там особыми параметрами окна делалось Always Top. - при нажатии win-D сначала окно минимизируется и тут же самостоятельно выскакивает обратно.

Автор: ~FoX~ 18.10.2004, 11:12
Хм.......а если отловить WM_MINIMIZE и развернуть окно обратно
З.Ы. Проверить не могу только что систему переставил

Автор: Akella 18.10.2004, 15:49
может можно отлавдивать сообщения и реагировать на них по своему
хотя
Цитата
IMHO долхлый номер. Win+D не победить.
я с этим тоже согласен

Автор: Snowy 18.10.2004, 16:21
У меня сработал вот такой вариант:

Кидаем на форму TApplicationEvent. Создаем событие OnMessage.

Код

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
 Application.BringToFront;
 Form1.FormStyle:=fsStayOnTop;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.Minimize;
end;


Как ни странно, если форму не минимизировать хотя бы раз, она не хочет обманывать Win+D. Поэтому при OnCreate сразу ее минимизим, и тогда она всегда лезет наверх.

Автор: ~FoX~ 19.10.2004, 08:33
Snowy
Странно, у меня не получается :(

Автор: <Spawn> 19.10.2004, 10:39
Попробуй поставить хук WH_CBT и ловить Code = HCBT_MINMAX, с последующей установкой результата функции хука в 1.

Автор: Nicholas 19.10.2004, 10:50
Цитата(Snowy @ 18.10.2004, 16:21)
Кидаем на форму TApplicationEvent. Создаем событие OnMessage.


:D
И у меня работает на Win XP, а на Win9x пробывал кто??
:qstn

Автор: imageman 19.10.2004, 11:08
Я сделал таймер и поставил в нем
Код

  win:=FindWindow('IEFrame',nil);
  style := GetWindowLong(win, GWL_EXSTYLE);
  if (style and WS_EX_TOPMOST) <> 0 then begin
       Showwindow(win,SW_MAXIMIZE);
       SetActiveWindow(win);
  end
  else begin
    ShowWindow(win, sw_hide);
    SetWindowPos(win, HWND_TOPMOST, 0,0,screen.Width,screen.Height, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
  end;


после этого окно нельзя надолго свернуть. Сделано, конечно криво!

Более грамотно сделано в TheBat - когда новое письмо приходит, то MailTicker не пропадает (у меня даже по Win-D). Может это из-за того, что оно постоянно обновляется?

Автор: Akella 31.1.2005, 12:17
Цитата(dsergey @ 18.10.2004, 15:49)
может можно отлавдивать сообщения и реагировать на них по своему
хотя
Цитата
IMHO долхлый номер. Win+D не победить.

я с этим тоже согласен


а теперь не согласен
у соседа игрушка отключает все подобные (для сворачивания) комбинации. Не смогли свернуть ее в панель задач smile

Автор: Snowy 31.1.2005, 13:10
Угу. Отключить никак. А вот всплыть обратно можно. Некоторые игрушки просто рисуют себя, используя поверхность DC(0), которую просто невозможно свернуть по определению.
Кстати, кто-нить пробовал приведенный мною выше код в 98-х? В ХР отрабатывает на ура.

Автор: Akella 31.1.2005, 14:46
Цитата(Snowy @ 31.1.2005, 13:10)
Угу. Отключить никак. А вот всплыть обратно можно. Некоторые игрушки просто рисуют себя, используя поверхность DC(0), которую просто невозможно свернуть по определению.


Светодиод винчестера даже НЕ "блымнул".

Автор: Marriage 31.1.2005, 15:06
Проверьте код, у меня работает ...
Не сворачивается даже по WINDOWS+D
Цитата
procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin

begin
Application.Minimize;
Application.Restore;
Application.BringToFront;
end;

end;


Автор: ДЫМ 5.2.2005, 02:19
Посмотри сюда
http://forum.vingrad.ru/index.php?showtopic=41584

Автор: Marriage 5.2.2005, 23:01
Цитата

Посмотри сюда


25-е июля .... ???

Что -то я не пойму, это получается , что вообще WINDOWS - D работать не будут в системе ...???

Автор: ДЫМ 6.2.2005, 02:59
Цитата
Что -то я не пойму, это получается , что вообще WINDOWS - D работать не будут в системе ...???


Этого то и добиваемся (еще меня радует, что отключается Win+L). А какой смысл отключать Win+D только для своего приложения. Впрочем, можно переделать глобальную ловушку в локальную (без DLL).

P.S. Кстати, Alt-Tab тоже отрубается, хотя везде говорят, что его "нельзя победить"

Автор: Marriage 6.2.2005, 14:58
Цитата

Этого то и добиваемся


Стртранно
Я думал тема называется
"Хочу, чтобы программа не сварачивалась!?, при нажатии Windows+D???"

Цитата

А какой смысл отключать Win+D только для своего приложения


Потому что многие покупать что-то подобное не будут ...


Автор: ДЫМ 7.2.2005, 03:47
Цитата
Стртранно
Я думал тема называется
"Хочу, чтобы программа не сварачивалась!?, при нажатии Windows+D???"


Я тебя, кажется понимаю, твой код приводит к тому, что все другие окна сворачиваются, а твоя форма - нет. Но есть еще такие клавиши как

Win+E ==> Explorer
Win+F+(Ctrl) ==> Find:All (and Find: Computer)
Win+M ==> Minimize all
Win+R ==> Run program.
Win+F1 ==> Windows Help
Alt+Tab


С ними-то как быть? А в XP еще и "страшная" Win+L

Если же надо, чтобы все эти сочетания не работали именно для твоей программы, а в других окнах обрабатывались, то используй локальную ловушку, вот примерно так:

Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

//------------------------------------
KBDLLHOOKSTRUCT = record
   vkCode: DWORD;
   scanCode: DWORD;
   flags: DWORD;
   time: DWORD;
   dwExtraInfo:Pointer;
 end;
 PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
 TPMsg = ^TMsg;

const
 HookHandle: hHook = 0;
 LLKHF_ALTDOWN  = KF_ALTDOWN shr 8;
 WH_KEYBOARD_LL = 13;
//------------------------------------

var
 Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------
// функция-фильтр
function KeyboardProc(nCode: integer; wParam: longint; lParam: longint): integer; stdcall;
var
 KeyStroke: boolean;
 p: PKBDLLHOOKSTRUCT;
begin
   KeyStroke := false;
   if (nCode = HC_ACTION) and {только для нашего приложения} Application.Active  then
   begin
       case wParam of
         WM_KEYDOWN, WM_SYSKEYDOWN,
         WM_KEYUP,    WM_SYSKEYUP:
         begin
           p := PKBDLLHOOKSTRUCT(lParam);
           KeyStroke :=
               ( (p^.vkCode = VK_LWIN) or (p^.vkCode = VK_RWIN)) or
               ( (p^.vkCode = VK_TAB) and ((p^.flags and LLKHF_ALTDOWN) <> 0) ) or
               ( (p^.vkCode = VK_ESCAPE) and ((p^.flags and LLKHF_ALTDOWN) <> 0) ) or
               ( (p^.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0) ) or
               ( (p^.vkCode = VK_F4) and ((p^.flags and LLKHF_ALTDOWN) <> 0) );
         end;
       end;//case
   end;

 if KeyStroke then
   result := 1
 else
   result := CallNextHookEx(0, nCode, wParam, lParam);
end;

//------------------------------------
// установка, отключение ловушки
procedure Hook(lRun:Boolean);
begin
if lRun then
 HookHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardProc, HInstance, 0)
else
 begin
  UnhookWindowsHookEx(HookHandle);
  HookHandle:=0;
 end;
end;
//------------------------------------


procedure TForm1.FormCreate(Sender: TObject);
begin
Hook(True);
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hook(False);
end;

end.


Цитата

Цитата
А какой смысл отключать Win+D только для своего приложения


Потому что многие покупать что-то подобное не будут ...


Еще как будут. Вот тебе ситуация: мне не раз говорили : "Сделай, чтобы было так, - включил компьютер, загрузилась твоя программа и никаких рабочих столов, переключений между окнами - а то наши пользователи очень уж непродвинутые, напортачат чего-нибудь, или, чего доброго, в игры играть начнут." Вот тут-то этот способ и пригодится.




Автор: Marriage 7.2.2005, 12:58
Цитата

Еще как будут. Вот тебе ситуация: мне не раз говорили : "Сделай, чтобы было так, - включил компьютер, загрузилась твоя программа и никаких рабочих столов, переключений между окнами - а то наши пользователи очень уж непродвинутые, напортачат чего-нибудь, или, чего доброго, в игры играть начнут."


Интересный вопрос, что за организация ???
Обучать сотрудников надо. А то блин кричат, что у сотрудников руки кривые ...
А сами ничего не делают ...

Цитата

в игры играть начнут


И как ты это исправишь отключением сочетания клавишь ???

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

Автор: ДЫМ 8.2.2005, 03:21
Цитата
Обучать сотрудников надо. А то блин кричат, что у сотрудников руки кривые ...
А сами ничего не делают ...


Нельзя ли немного покорректнее?...

Цитата

Цитата
в игры играть начнут
И как ты это исправишь отключением сочетания клавишь ???
А юзьвери в основном с мышой работают, может я не понимаю чего-нибудь, но если повесить хук на клавиатуру, он что, и мышу отловит ????


Я смотрю пошел откровенный флейм, но я отвечу (подробнее). Я говорил о схеме "одна машина - одна задача" (используется, например, в технологическом мониторинге). Выглядит это так:
загружается Windows, затем твоя программа - главная форма во весь экран и можно без заголовка. Панель задач отключается, чтобы не было искушения "с мышой поработать", дополнительно вешается хук на клавиатуру. В итоге пользователь может общаться только с твоей программой. После завершения работы приложения вызывается завершение работы компьютера. И все. Надеюсь, понятно?


Автор: Vit 8.2.2005, 07:27
win-D не сворачивает ничего, оно десктоп выносит вперёд а все приложения назад... Сворачивает Win-M.

Цитата
Я смотрю пошел откровенный флейм, но я отвечу (подробнее). Я говорил о схеме "одна машина - одна задача" (используется, например, в технологическом мониторинге). Выглядит это так:
загружается Windows, затем твоя программа - главная форма во весь экран и можно без заголовка. Панель задач отключается, чтобы не было искушения "с мышой поработать", дополнительно вешается хук на клавиатуру. В итоге пользователь может общаться только с твоей программой. После завершения работы приложения вызывается завершение работы компьютера. И все. Надеюсь, понятно?


Тогда это решается не програмно, а через Policy в реестре - устанавливаются все разрешения и не даются администранивные права, чтоб мышь не трогали - мышь - выдёргивается и кладётся в ящик стола на ключ, в BIOS отключается USB и PS порты, ставится пароль на BIOS. В Hardware профиле для этого пользователя отключается драйвер мыши, а если надо то и клавиатуры... и на фиг програмный огород городить... Моё ИМХО - 99% попыток перехвата Ctrl-Alt-Del, Win-D, Win-L и т.п. - это вредоносный код, вирусы и трояны, а оставшийся 1% - невежество сисадминов, которым лень букварь читнуть по Windows и которые ставять программистам бредовые задачи.

Автор: Snowy 8.2.2005, 08:21
Цитата(Vit @ 8.2.2005, 07:27)
win-D не сворачивает ничего, оно десктоп выносит вперёд а все приложения назад...

Позволю себе такую наглость - не согласиться.
Я конечно событиев не ловил, но очевидно, что просто при потере фокуса приложения из панели задач в трэй сворачиваться не будут, независимо от того, какое окно вылезло наверх.
(Касается естественно только тех приложений, который на минимизацию лезут в трей).

Автор: Marriage 8.2.2005, 13:27
2
ДЫМ

Короче, действительно щас флей пойдет.
ПРосто, если по моему опыту
Цитата
"одна машина - одна задача"
, такого я не видел.
Если только так, тогда хорошо, без Б. ПРизнаю , что это подеюйствует.
А если несколько -тогда хук на клаву - это не выход, ИМХО.

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