Когда то очень давно мне в руки попал Хакер за
апрель 2003 года. В нем была статья про то, как через IrDA и при
помощи пульта дистанционного управления управлять Виндой. Я тогда помню накупил деталей, спаял ИК-приемник, но ничего у меня не вышло :). Недавно захотел довести начатое до конца, но уже на основе Bluetooth. Для этого нам понадобится тело с "синим зубом" и BT-адаптер для компа.
Так как самому реализовывать в дельфи работу с bluetooth было долго и муторно, я решил взять уже готовую библиотеку: Bluetooth Framework Library, которую написал наш соотечественник (правда она без исходников). С библиотекой идет несколько демок, показывающих основные возможности.
Нам же сегодня потребуется KeypadControl. Отрываем \source и устанавливаем библиотеку, потом копируем все содержимое этой папки, открываем \demo_doc\demo\KeypadControl, вставляем и запускаем KeypadControl.dpr. Перед нами открылась главная форма этой демки. Она может обрабатывать нажатия кнопок на теле и по нажатию кнопок на форме эмулировать их нажатие на теле. Я предлагаю создать для тела простой мидлет, в котором будет крутиться цикл до тех пор, пока не нажата клавиша "0". Его можно скачать тут
http://www.mobileservicesoft.narod.ru/blank.rar. Теперь необходимо придумать, за что будет отвечать каждая кнопка на теле. У меня siemens cx75 и для него я реализовал так:
джойстик - перемещает курсор (причем перемещаем, пока кнопка нажата, в таймере)
нажать его - левая кнопка мыши
левая софт кнопка - двойное нажатие левой кнопки мыши
правая софт кнопка - правая клавиша мыши
зеленая трубка - reboot
красная трубка - shutdown
1 - enter
2 - стрелка вверх
3 - закрыть активное окно
4 - стрелка влево
5 - стрелка вниз
6 - стрелка вправо
7 - отрыть лоток CD
8 - закрыть лоток CD
9 - свернуть активное окно
Для реализации задуманного нужно удалить все кнопки с форы кроме Connect и соответственно все обработчики нажатий на эти кнопки. Добавить таймер и все. ShowMessage('DOWN: ' + Key) - тоже надо везде удалить.
Давайте посмотрим, как все это работает. Запускаем
приложение, появляется окно, на нем одна кнопка Connect, после ее нажатия вылезет несколько окон - там все
просто. Теперь соединение установлено. Нажатие кнопки на теле генерирует событие BFKeypadControlClientKeyDown(Sender: TObject; Key: String), где key - это код нажатой кнопки. Теперь нужно поместить простой case и все, хотя все лучше видно на исходнике:
key1:=key[1]; //это нужно, чтобы в обработке таймера знать какая кнопка была нажата
a1:=0;
a2:=0;
case key[1] of
'<' : a1:=-10; //курсор влево
'>' : a1:=10; //курсор вправо
'^' : a2:=-10; //курсор вверх
'V' : a2:=10; //курсор вниз
'F' : begin //нажимаем левую кнопку мыши
GetCursorPos(p);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, P.x, P.y, 0, 0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, P.x, P.y, 0, 0);
end;
'[' : begin //нажимаем левую кнопку мыши дважды
GetCursorPos(p);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, P.x, P.y, 0, 0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, P.x, P.y, 0, 0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, P.x, P.y, 0, 0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, P.x, P.y, 0, 0);
end;
']' : begin //нажимаем правую кнопку мыши
GetCursorPos(p);
mouse_event(MOUSEEVENTF_RIGHTDOWN, P.x, P.y, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, P.x, P.y, 0, 0);
end;
'S' : WinExec(PChar('shutdown -t 0 -r'),SW_SHOWNORMAL); //reboot
'C' : WinExec(PChar('shutdown -t 0 -s'),SW_SHOWNORMAL); //shutdown
'1' : begin //эмулируем нажатие кнопки enter
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
end;
'2' : begin //эмулируем нажатие стрелки вверх
keybd_event(vk_up,0,0,0);
keybd_event(vk_up,0,KEYEVENTF_KEYUP,0);
end;
'3' : SendMessage(GetForegroundWindow, WM_CLOSE,0,0); //закрываем активное окно
'4' : begin //эмулируем нажатие стрелки влево
keybd_event(VK_LEFT,0,0,0);
keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0);
end;
'5' : begin //эмулируем нажатие стрелки вниз
keybd_event(VK_DOWN,0,0,0);
keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
end;
'6' : begin //эмулируем нажатие стрелки вправо
keybd_event(VK_RIGHT,0,0,0);
keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0);
end;
'7' : mciSendString('Set cdaudio door open wait', 0, 0, 0); //отрываем лоток CD
'8' : mciSendString('Set cdaudio door closed wait', 0, 0, 0);//закрываем лоток CD
'9' : ShowWindow(GetWindowLong(GetForegroundWindow,GWL_HWNDPARENT),SW_MINIMIZE);
//сворачиваем активное окно
end;
if (GetCursorPos(p)=true)and
((key1='<')or(key1='>')or(key1='^')or(key1='V')) then
begin
Timer1.Enabled:=true; //запускаем таймер
SetCursorPos(p.X+a1,p.Y+a2); //перемещаем курсор
end;
В обработке таймера прописываем перемещение курсора. Как только кнопку джойстика отпустили происходит BFKeypadControlClientKeyUp, где и нужно
прописать Timer1.Enabled:=false.
Прога может работать при соединении тела с ПК через IrDA, Bluetooth и COM порт. Скачать исходник проги можно тут
http://mobileservicesoft.narod.ru/rem.rar, а саму библиотеку на
www.btframefork.com.