Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2011, 13:09   #1
Вячеслав Юрьевич
 
Регистрация: 28.07.2011
Сообщений: 7
Вопрос Не работает в реестре програмное нажатие кнопок мыши и клавиатуры.

Всем доброго времени суток.
Я пишу с другом программу... в одном из её "блоков" необходимо програмно управлять мышью, кликать её, а также програмно нажимать клавиши клавиатуры. Сделал, начал тестировать... в "обычных окнах" работает, а вот в реестре можно только указателем шевелить, кликнуть в заданных координатах невозможно, также как и нажать програмно клавишу.
Использую следующие процедуры:
1. Для мыши:
1)SetCursorPos(x, y); // Новые координаты курсора
2)Mouse_Event(MOUSEEVENTF_LEFTDOWN, x,y,0,0);
3)Mouse_Event(MOUSEEVENTF_LEFTUP,x, y,0,0);
2.Для клавиатуры:
keybd_event(KEY), 0, 0, 0);
keybd_event(Ord(KEY), 0, KEYEVENTF_KEYUP, 0);

Я полагаю что Windows "защищает" реестр от "вторжение". Но ведь с экранной клавиатуры в нём печатать можно. Наверно нужно посылать команды наперерез драйверу клавиатуры, через WMI... ну в общем я не знаю как, и лучше не буду предполагать дабы не нести чушь.
Знающие люди, пожалуйста помогите. Буду очень благодарен.

P.S.: Если кто знает какой нибудь учебник по WMI - посоветуйте пожалуйста.
Вячеслав Юрьевич вне форума Ответить с цитированием
Старый 29.08.2011, 14:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а вот в реестре можно только указателем шевелить
В реестре вообще-то ничем шевелить нельзя.
Цитата:
Я полагаю что Windows "защищает" реестр от "вторжение".
Ересь. Regedit, если ты ее имеешь ввиду ничем не защищен, просто ты что-то не так делаешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2011, 15:23   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

виртуально перетаскиваем объект мышкой
Код:
//нажимаем клавишу мыши, перетаскиваем курсов на новое место и отпускаем
      SetCursorPos(15,150);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      SetCursorPos(65,200);//новое положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
или просто нажимаем левую клавишу мыши
Код:
SetCursorPos(190,105);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace на форуме Ответить с цитированием
Старый 29.08.2011, 19:09   #4
Вячеслав Юрьевич
 
Регистрация: 28.07.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
виртуально перетаскиваем объект мышкой
Код:
//нажимаем клавишу мыши, перетаскиваем курсов на новое место и отпускаем
      SetCursorPos(15,150);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      SetCursorPos(65,200);//новое положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
или просто нажимаем левую клавишу мыши
Код:
SetCursorPos(190,105);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Ну, я так и делаю.
Для эксперимента я задавал курсору координаты 10,10 и кликал туда (отпускал и нажимал точнее), а также пробовал с задержкой - получался двойной клик. Похожим образом экспериментировал и с клавиатурой. Делал в батоне Sleep(1000) и побуквенный набор своего имени. Тоесть жмёшь на батон быстренько выбираешь окно где печатать (пробовал блоткнот, строку поиска в GOOGLE, проводник и ... реестр) и программа там печатала. Но это не цель - это тест.

Я же на чистом делитанском языке объяснил что нужно нечто Mouse_Event и keybd_event, но чтобы работало в редакторе реестра (regedit). И есть подозрения что эти процедуры не работают и в других важных для Windows местах.
Вячеслав Юрьевич вне форума Ответить с цитированием
Старый 29.08.2011, 19:19   #5
Вячеслав Юрьевич
 
Регистрация: 28.07.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
В реестре вообще-то ничем шевелить нельзя..
Я имел ввиду стандартный редактор (Regedit), а не файл реестра где действительно шевелить буквально, не метафорически, ничем нельзя.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ересь. Regedit, если ты ее имеешь ввиду ничем не защищен, просто ты что-то не так делаешь.
Ну сожгите тогда меня на виртуальном костре, но прежде ответьте на вопрос если точно пробовали сами сие сделать.

И кстати, сам не пробовал но друг говорил что через TeamViewer тоже не получается "лазить" в редакторе реестра.
Вячеслав Юрьевич вне форума Ответить с цитированием
Старый 29.08.2011, 20:00   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
но чтобы работало в редакторе реестра
Блажь ?)
Что мешает программно открыть реестр и смотреть/править его безо всяких мышеклаводвижений ?

Цитата:
друг говорил что через TeamViewer тоже не получается
У меня получается.
Что я делаю не так ? И нафих такой "друг" ?)
mss вне форума Ответить с цитированием
Старый 29.08.2011, 20:25   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

стоп! у меня была такая проблема! надо сделать в таймере с интервалом 2000мс, иначе не будет успевать срабатывать клик мышкой!!! вспомнил, почему не работало у меня. Таймер кидай на форму и обрабатывай шаги: на первом - открываем окно, на втором - смещаем его на нужную позицию, на третьем - мышкой орудуем...и т.д.
Вот тебе пример куска моего кода:
Код:
Код:
//----- делаем прозрачное выделение в Paint ---------------------------------
   if(cnt=-1)then
   begin
      SetCursorPos(190,105);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
   end;
   if(cnt=0)then
   begin
      SetCursorPos(175,283);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
      k:=0;
   end;
   if(cnt=1)then
   begin
      //----- открываем диалоговое окно Paint -> CTRL+O ------------------------
      keybd_event(vk_control,0,0,0);
      keybd_event(79,0,0,0);
      keybd_event(79,0,KEYEVENTF_KEYUP,0);
      keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
   end;
   if(cnt=2)then
   begin
      Clipboard.AsText:=Put+sps[k-1];//копируем полное имя в буфер обмена
      //----- вставляем полное имя файла в окно Paint -> CTRL+V ----------------
      keybd_event(vk_control,0,0,0);
      keybd_event(86,0,0,0);
      keybd_event(86,0,KEYEVENTF_KEYUP,0);
      keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
      SetKey(13);
   end;
   if(cnt=2)then
   begin
      //----- нажимаем ALT+TAB -------------------------------------------------
      keybd_event(18,0,0,0);
      keybd_event(9,0,0,0);
      keybd_event(9,0,KEYEVENTF_KEYUP,0);
      keybd_event(18,0,KEYEVENTF_KEYUP,0);
   end;
   if(cnt=3)then
   begin
      //----- нажимаем CTRL+A --------------------------------------------------
      keybd_event(vk_control,0,0,0);
      keybd_event(65,0,0,0);
      keybd_event(65,0,KEYEVENTF_KEYUP,0);
      keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
      //----- копируем изображение текста -> CTRL+C ----------------------------
      keybd_event(vk_control,0,0,0);
      keybd_event(67,0,0,0);
      keybd_event(67,0,KEYEVENTF_KEYUP,0);
      keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
   end;
   if(cnt=4)then
   begin
      //----- нажимаем ALT+TAB -------------------------------------------------
      keybd_event(18,0,0,0);
      keybd_event(9,0,0,0);
      keybd_event(9,0,KEYEVENTF_KEYUP,0);
      keybd_event(18,0,KEYEVENTF_KEYUP,0);
   end;
   if(cnt=5)then
   begin
      //----- вставляем текст на изображение -----------------------------------
      keybd_event(vk_control,0,0,0);
      keybd_event(86,0,0,0);
      keybd_event(86,0,KEYEVENTF_KEYUP,0);
      keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
   end;
   if(cnt=6)then
   begin
      //----- нажимаем клавишу мыши и перетаскиваем рисунок на новое место -----
      SetCursorPos(5+10,140+10);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      SetCursorPos(5+StrToInt(Edit1.Text),140+StrToInt(Edit2.Text));//новое положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
   end;
   if(cnt=7)then
   begin
      //----- сохраняем изображение сжатым -> CTRL+S ---------------------------
      keybd_event(vk_control,0,0,0);
      keybd_event(83,0,0,0);
      keybd_event(83,0,KEYEVENTF_KEYUP,0);
      keybd_event(vk_control,0,KEYEVENTF_KEYUP,0);
   end;
   if(cnt=8)then
   begin
      cnt:=0;
      k:=k-7;
      if(k=q)then
      begin
         Timer1.Enabled:=False;
         CreateSps;
         CreateSps;
         Close;
      end;
   end;
end;
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace на форуме Ответить с цитированием
Старый 29.08.2011, 21:01   #8
Вячеслав Юрьевич
 
Регистрация: 28.07.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
стоп! у меня была такая проблема! надо сделать в таймере с интервалом 2000мс, иначе не будет успевать срабатывать клик мышкой!!! вспомнил, почему не работало у меня. Таймер кидай на форму и обрабатывай шаги: на первом - открываем окно, на втором - смещаем его на нужную позицию, на третьем - мышкой орудуем...и т.д.
Вот тебе пример куска моего кода:
Код:
//----- делаем прозрачное выделение в Paint ---------------------------------
   if(cnt=-1)then
   begin
      SetCursorPos(190,105);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
   end;
   if(cnt=0)then
   begin
      SetCursorPos(175,283);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
      k:=0;
   end;
   if(cnt=...
end;

Проблема не в двойном клике а в том что Окно редактора реестра нифига не реагирует на
Mouse_Event(MOUSEEVENTF_LEFTDOWN,10 ,10,0,0);
Mouse_Event(MOUSEEVENTF_LEFTUP,10,1 0,0,0); это как пример.

А нужно мне всё это для того чтобы один компьютер управлял другим и клиент получая координаты мыши,коды нажатых клавиш клавиатуры и мыши програмно этим всем "ЩЕВЕЛИЛ!", отправляя назад серверу свой принтскрин.
А случай с редактором реестра ломает универсальность
Вячеслав Юрьевич вне форума Ответить с цитированием
Старый 29.08.2011, 21:42   #9
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

В программе-утилите RegOrganizer тоже есть редактор реестра, наподобие RegEdit'а. Может, тогда там сработает Ваш код?
У меня была проблема, что надо было свою форму скрыть и уже потом работать этими виртуальными командами с чужими окнами, иначе он работает только со своим окном. У Вас так? Если нет, то попробуйте скрыть своё окно на время выполнения этих команд.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 29.08.2011 в 21:48.
NetSpace на форуме Ответить с цитированием
Старый 30.08.2011, 14:49   #10
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Код:
Проблема не в двойном клике а в том что Окно редактора реестра нифига не реагирует на 
 Mouse_Event(MOUSEEVENTF_LEFTDOWN,10 ,10,0,0);
 Mouse_Event(MOUSEEVENTF_LEFTUP,10,1 0,0,0); это как пример.
только что попробовал все работает проблема может быть в том что фокус не передан данному окну у меня все работает на ура.
P.S. Вы прогу делаете по локалки?
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
програмное нажатие кнопок мыши ALKOrobot Общие вопросы C/C++ 7 25.03.2012 12:12
Нажатие кнопок мыши в чужом приложении Der_G()RuNu(h Работа с сетью в Delphi 16 25.05.2011 13:09
Не работает MessageBox нет реакции на нажатие кнопок Vladya Общие вопросы C/C++ 2 09.03.2010 13:29
Програмное нажатие на клавиши mustang007 Общие вопросы Delphi 6 24.05.2009 11:40
Нажатие кнопок мыши zzzzz Win Api 7 02.12.2007 12:33