Как перехватить все клавиши?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как перехватить все клавиши?

Сообщение arthur2 » 08.01.2011 (Сб) 10:31

Прежде всего, конечно - клавишу Пуск.

И не говорите мне, что этого делать "не надо".

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

Если это программно не решается, то просто - какие будут советы?
Артур
 
   

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Как перехватить все клавиши?

Сообщение Joo » 08.01.2011 (Сб) 11:00

arthur2 писал(а):Если это программно не решается, то просто - какие будут советы?

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

Вроде уже не раз поднимались подобные темы.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 08.01.2011 (Сб) 11:19

Нет, это всё не то.

Скажем, я написал программу, в которой по нажатии клавиш происходят всякие разные интересные действия: вспыхивают разные цвета на экране, играются разные звуки и пр.

Теперь доча жмет на какой-нибудь там пуск - и вылетает непонятно куда. А нужно, чтобы куда бы она ни нажала, работала бы всё равно моя программа.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 08.01.2011 (Сб) 14:00

Тю, да это совершенно другим путём решается.

Создаёшь новый десктоп и показываешь своё окно в нём. В новом десктопе не будет активны никакие привычные хоткеи, ни «Пуск», ни альт-таб, ни Ctrl+Atl+Del, никаких окон из чужих десктопов — разве что, кажется, Win+L останется, в силу концепции того, что один пользователь не должен вредить другому.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 08.01.2011 (Сб) 15:08

Здорово!
После эксперимента (не позаботился заранее о возвращении) пришлось перезагружаться :)

Спасибо!

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

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Как перехватить все клавиши?

Сообщение Joo » 08.01.2011 (Сб) 17:37

arthur2 писал(а):А как показать своё окно на новом рабочем столе? Нужно обязательно запускать новый процесс? Тот, кто создал новый рабочий стол - сам может на него попасть?

На сколько я понял, нужно создать рабочий стол до того как было создано какое либо окно в текущем процессе, но я в подробности не вдавался, так-как это был просто эксперимент, думаю в MSDN есть четкие инструкции по этому поводу.
В VB.NET в процедуре main, я сначала создавал новый рабочий стол, а только потом создавал и отображал окно. Все работало на ура.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 08.01.2011 (Сб) 20:16

В общем, как следует из этого топика: viewtopic.php?p=129347#p129347

tyomitch писал(а):Поскольку даже для безоконного приложения VB6 создаёт окна ThunderRT6Main и VBFocusRT6, то перебраться на другой десктоп тебе не удастся


Так что придется всё-таки создавать процесс. Вот нормальный пример:
http://www.vbaccelerator.com/home/VB/Co ... rticle.asp

Интересно, а если моя программа на новом десктопе вдруг зависнет - всё, борода? назад не вернуться?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 08.01.2011 (Сб) 20:34

arthur2 писал(а):Вот нормальный пример:

А у себя?

arthur2 писал(а):Интересно, а если моя программа на новом десктопе вдруг зависнет - всё, борода? назад не вернуться?

В нашем примере — программа, переключающая десктоп не селится в новом десктопе.

arthur2 писал(а):
tyomitch писал(а):Поскольку даже для безоконного приложения VB6 создаёт окна ThunderRT6Main и VBFocusRT6, то перебраться на другой десктоп тебе не удастся

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

Так вот, мысль заключается в том, что если имеет место быть единичный случай и небольшой блек-магик-кодинг допускается, ты можешь написать на VB функцию, которая создаст десктоп и выполнить переключение, а потом (с помощью сторонней маленькой программки, как этом посте) заменить этой своей функцией стандартную EntryPoint-функцию EXE-шника. Тогда вся работа с десктопами выполнится до создания невидимых окон.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 08.01.2011 (Сб) 21:33

Хакер писал(а):А у себя?
Там ссылка нерабочая. В принципе, код там есть и так. В плане запуска проги на другом десктопе - практически то же, что и по моей ссылке (там, правда, бонусом есть ещё ожидание по семафору :)

arthur2 писал(а):Интересно, а если моя программа на новом десктопе вдруг зависнет - всё, борода? назад не вернуться?

Хакер писал(а):В нашем примере — программа, переключающая десктоп не селится в новом десктопе.
В "моём" - тоже не селится. Но та программа, которую я запускаю на новом десктопе - тоже моя, а вот если она зависнет...
ANDLL писал(а):'Запускаем "анлокер". Если он вдруг не запустится, пеняйте на себя :)


Хакер писал(а):Тогда вся работа с десктопами выполнится до создания невидимых окон.
Я тоже уже подумал о том же самом :) Но поскольку "имеет место быть единичный случай", то мне, пожалуй, вполне хватит запуска проги другой прогой.

Тем более, что запускающей может понадобится больше прав, чем запускаемой :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 08.01.2011 (Сб) 21:50

arthur2 писал(а):Но та программа, которую я запускаю на новом десктопе - тоже моя, а вот если она зависнет...

Ну, можно же отловить, что процесс «завис».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 08.01.2011 (Сб) 22:10

Как?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 08.01.2011 (Сб) 22:40

Вот сразу как. Не как, а что.

Что значит «завис»? «Завис» — это термин домохозяек, применяемый к программам, у которых поток не обрабатывает WM_PAINT для своих окон, и поэтому они не перерисовываются, и клавиатурные/мышиные сообщения, и поэтому окна не реагируют.

А теперь скажи с точки зрения вменяемой, программистской, что надо, и я легко отвечу, как.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 7:11

Это может быть что угодно: например, не выгрузились какие-то объекты или программа почему-то не вышла из какого-нибудь цикла. То есть, с точки зрения системы это может и не быть зависанием вовсе - программа просто "продолжает работать".
Тем более, я переделал пример в запуск любой программы в новом рабочем столе. И что в ней может быть причиной зависания - одному богу известно.

Вижу как вариант: запускать вместе с программой на новый рабочий стол своего маленького киллера, который по хоткию убил бы её, не разбираясь, зависла она али нет.
Артур
 
   

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Как перехватить все клавиши?

Сообщение SLIM » 09.01.2011 (Вс) 8:35

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

Он работать не будет если не будут обрабатываться сообщения, о которых говорит Хакер.
Пишите жизнь на чистовик.....переписать не удастся.....

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 8:54

SLIM писал(а):Он работать не будет если не будут обрабатываться сообщения, о которых говорит Хакер.
С чего бы это? Я запускаю на новый рабочий стол две программы - одна та, которую надо запустить и которая в силу каких-либо причин может зависнуть. Вторая - киллер для подстраховки - ничего делать не умеет, кроме как убить по хоткию первую и самой умереть. Вторая зависнуть не может, потому что в ней и зависать-то нечему.
Артур
 
   

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Как перехватить все клавиши?

Сообщение Joo » 09.01.2011 (Вс) 8:57

Напиши "Запускатор", который создаст новый рабочий стол, запустит новый процесс, использующий созданный рабочий стол. И пусть этот "Запускатор" мониторит процесс, пока она не выгрузилась, на предмет зависания(не обрабатывает WM_PAINT, клавиатурные и мышиные сообщения). По завершении процесса, "Запускатор" выполнит переключение обратно и завершится сам.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 9:09

Joo писал(а):"Запускатор"
О! хорошее словцо :)
Собстенно, так и есть - я написал запускатор, который запускает скормленный ему экзешник на новом рабочем столе и ждет, пока тот завершится.

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

Кстати: а если программа, находящаяся на другом десктопе, сама запускает ещё одну - это ещё одна тоже будет на другом десктопе? И можно ли передавать сообщения между окнами на разных рабочих столах?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 09.01.2011 (Вс) 12:43

arthur2 писал(а):это ещё одна тоже будет на другом десктопе?

MSDN писал(а):The system determines the desktop to assign to the thread according to the following rules:
  1. If the thread has called the SetThreadDesktop function, it connects to the specified desktop.
  2. If the thread did not call SetThreadDesktop, it connects to the desktop inherited from the parent process.
  3. If the thread did not call SetThreadDesktop and did not inherit a desktop, the system attempts to open for MAXIMUM_ALLOWED access and connect to a desktop as follows:
    • If a desktop name was specified in the lpDesktop member of the STARTUPINFO structure that was used when the process was created, the thread connects to the specified desktop.
    • Otherwise, the thread connects to the default desktop of the window station to which the process connected.



arthur2 писал(а):И можно ли передавать сообщения между окнами на разных рабочих столах?

MSDN писал(а):Window messages can be sent only between processes that are on the same desktop. In addition, the hook procedure of a process running on a particular desktop can only receive messages intended for windows created in the same desktop.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 13:22

Моё понимание английского текста довольно расплывчато. Со вторым вопросом, на сколько я понял, облом, месаджи не пройдут :)

С первым: если я вызвал SetThreadDesktop, значит ли это, что я приканектился к этому дестопу и хоть и не могу создавать в нём окон, но могу получать из него hotkeys?

Остальное, вроде, понятно: если я на одном столе, но приканектился к другому, то могу запустить процесс на этом другом, если укажу его имя в lpDesktop.
Если я на другом столе и никуда не конектился, то всё мной запущенное будет на одном со мной столе.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 09.01.2011 (Вс) 13:28

arthur2 писал(а):С первым: если я вызвал SetThreadDesktop, значит ли это, что я приканектился к этому дестопу и хоть и не могу создавать в нём окон, но могу получать из него hotkeys?

Не понял.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 13:39

Если я зарегистрирую hotkey на свой запускатор, я его получу?

Запускатор делает SetThreadDesktop своего потока на друой десктоп. Значит, он сможет получить срабатывание хоткия с этого другого рабочего стола?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 09.01.2011 (Вс) 13:41

arthur2 писал(а):Запускатор делает SetThreadDesktop своего потока на друой десктоп.

А смысл?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 14:31

В смысле?

Хакер писал(а):В новом десктопе не будет активны никакие привычные хоткеи, ни «Пуск», ни альт-таб, ни Ctrl+Atl+Del, никаких окон из чужих десктопов

А если я через SetThreadDesktop приканнектил свой поток к этом новому десктопу, то получу ли хоткей, будучи на новом десктопе? Понятно, что WM_HOTKEY в мои ОКНА не придут, но если в hwnd передать нуль, то
сообщения WM_HOTKEY посылаются в очередь сообщений вызывающего потока
, то есть придут ли они мне при таком раскладе?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 09.01.2011 (Вс) 15:27

Ты хочешь из вызывателя среагировать на хоткей из чужого десктопа?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 15:31

да
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 09.01.2011 (Вс) 15:32

Чтобы что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 16:00

чтобы выйти из нового дестопа, если что :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перехватить все клавиши?

Сообщение Хакер » 09.01.2011 (Вс) 16:35

Почему бы не сделать это очевидно хорошим и уже продемонстрированным способом — используя объекты синхронизации?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как перехватить все клавиши?

Сообщение arthur2 » 09.01.2011 (Вс) 19:33

Ты имеешь ввиду пример ANDLL-а с семафорами? В примере продемонстрировано, как получить ответ от программы с другого стола. Там всё наоборот - если ответ не получен, разблокировки не будет.

Мне же надо, находясь на другом столе, иметь способ в любой момент, вернуться на дефолтный.
Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как перехватить все клавиши?

Сообщение Twister » 10.01.2011 (Пн) 7:08

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

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

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 70

    TopList