|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите пожалуйста
Здравствуйте, уважаемые программисты;
Я весьма удачно похоже забрёл на этот форум. Дело в том, что у нас в школе программирование с Borland Delphi пока ещё на весьма детском уровне. Недавно прошли массивы ; Я уже нашёл себе множество литературы по delphi, но объём информации, мне в данном случае ненужной, очень высок, и это меня привело в этот раздел. Вот такая задачка: ; Есть полноэкранное приложение (игра), то ли OpenGL, то ли Direct3D, точно не скажу, сам не вдавался. Единственное, что нужно: 1. Програмно взять под контроль мышку и её передвижения, а так же эмулировать нажатия клавиатуры (левая кнопка мыши и клавиши F1-F8). Соответственно, нужно стукнуть мышкой в точку с данными координатами; 2. Из точки на экране с заданными координатами получить её RGB значение; Именно для этих двух пунктов я и ничего не могу предпринять. Остальную часть программы я уже сделал. Дело в том, что я не знаю ни одного оператора по этим командам. И, скажите пожалуйста, нужно ли мне искать какую-нибудь библиотеку для этих операций, или стандартная SysUtils сгодится; И, при этом, хорошо бы сделать движение мышки плавным (но это совсем не обязательно, главное - чтоб работало); Заранее огромное спасибо! И, если можно, посоветуйте литературу по этой тематике... end. Последний раз редактировалось Iskander, 06.10.2009 в 23:33. |
#2
|
|||
|
|||
После долгих блужданий по интернету я нашёл набор функций
setcursorpos function GetPixel(DC: HDC; X, Y: Integer): Longint; function GetDC(Wnd: HWnd): HDC; function GetActiveWindow: HWnd; Всё уже, казалось бы, готово, но компилятор никак не даёт завершить программу, пишет: Return value of function 'GetActiveWindow' might be undefined. Подскажите, в чём дело? Функция вроде простая, без параметров, вернёт мне индикатор активного окна, а всё равно не хочет. |
#3
|
||||
|
||||
Цитата:
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#4
|
|||
|
|||
Сейчас я ещё помучался (уверенно вроде программно контролю мышку).
Запор всё тот же: Пытаюсь вывести цвет пиксела: writeln(GetPixel(GetDC(0),x,y)); независимо ни от чего выводит 0. По идее getDC(0) должен вернуть дескриптор для всего экрана, но пока всё, что происходит в компе, для меня остаётся загадкой. Предыдущая проблема уже не актуальна, я с ней разобрался. P.S. А в uses ничего кроме windows и SysUtils не надо? Последний раз редактировалось Iskander, 07.10.2009 в 15:37. |
#5
|
||||
|
||||
х, у - переменные? у них какие значения?
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#6
|
||||
|
||||
Код:
этими командами мы узнаем цвет пикселя на экране по координатам X,Y procedure TForm1.Button1Click(Sender: TObject); Var DesktopCanvas :TCanvas ; BitMap :TBitMap; AColor:tcolor; begin DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=GetDC(Hwnd_Desktop); BitMap := TBitMap.Create; BitMap.Width := Screen.Width; BitMap.Height:=Screen.Height; Bitmap.Canvas.CopyRect(Bitmap.Canvas.ClipRect, DesktopCanvas, DesktopCanvas.ClipRect); AColor:=Bitmap.Canvas.Pixels[15,30];//[X,Y]; цвет пикселя записывается в переменную AColor в виде color AColor:=colortorgb(AColor);//переводим color в RGB end; end; end. [что касается эмуляции нажатия кнопок f1 и f8 код такой] keybd_event(VK_F1, 0, 0, 0);// эмуляции нажатия кнопок в данном коде на F1 и вот может пригодится Virtual Key Code Corresponding key VK_LBUTTON Left mouse button VK_RBUTTON Right mouse button VK_CANCEL Control+Break VK_MBUTTON Middle mouse button VK_BACK Backspace key VK_TAB Tab key VK_CLEAR Clear key VK_RETURN Enter key VK_SHIFT Shift key VK_CONTROL Ctrl key VK_MENU Alt key VK_PAUSE Pause key VK_CAPITAL Caps Lock key VK_KANA Used with IME VK_HANGUL Used with IME VK_JUNJA Used with IME VK_FINAL Used with IME VK_HANJA Used with IME VK_KANJI Used with IME VK_CONVERT Used with IME VK_NONCONVERT Used with IME VK_ACCEPT Used with IME VK_MODECHANGE Used with IME VK_ESCAPE Esc key VK_SPACE Space bar(пробел) VK_PRIOR Page Up key VK_NEXT Page Down key VK_END End key VK_HOME Home key VK_LEFT Left Arrow key VK_UP Up Arrow key VK_RIGHT Right Arrow key VK_DOWN Down Arrow key VK_SELECT Select key VK_PRINT Print key (keyboard-specific) VK_EXECUTE Execute key VK_SNAPSHOT Print Screen key VK_INSERT Insert key VK_DELETE Delete key VK_HELP Help key VK_LWIN Left Windows key (Microsoft keyboard) VK_RWIN Right Windows key (Microsoft keyboard) VK_APPS Applications key (Microsoft keyboard) VK_NUMPAD0 0 key (numeric keypad) VK_NUMPAD1 1 key (numeric keypad) VK_NUMPAD2 2 key (numeric keypad) VK_NUMPAD3 3 key (numeric keypad) VK_NUMPAD4 4 key (numeric keypad) VK_NUMPAD5 5 key (numeric keypad) VK_NUMPAD6 6 key (numeric keypad) VK_NUMPAD7 7 key (numeric keypad) VK_NUMPAD8 8 key (numeric keypad) VK_NUMPAD9 9 key (numeric keypad) VK_MULTIPLY Multiply key (numeric keypad) VK_ADD Add key (numeric keypad) VK_SEPARATOR Separator key (numeric keypad) VK_SUBTRACT Subtract key (numeric keypad) VK_DECIMAL Decimal key (numeric keypad) VK_DIVIDE Divide key (numeric keypad) VK_F1 F1 key VK_F2 F2 key VK_F3 F3 key VK_F4 F4 key VK_F5 F5 key VK_F6 F6 key VK_F7 F7 key VK_F8 F8 key VK_F9 F9 key VK_F10 F10 key VK_F11 F11 key VK_F12 F12 key VK_F13 F13 key VK_F14 F14 key VK_F15 F15 key VK_F16 F16 key VK_F17 F17 key VK_F18 F18 key VK_F19 F19 key VK_F20 F20 key VK_F21 F21 key VK_F22 F22 key VK_F23 F23 key VK_F24 F24 key VK_NUMLOCK Num Lock key VK_SCROLL Scroll Lock key VK_LSHIFT Left Shift key (only used with GetAsyncKeyState and GetKeyState) VK_RSHIFT Right Shift key (only used with GetAsyncKeyState and GetKeyState) VK_LCONTROL Left Ctrl key (only used with GetAsyncKeyState and GetKeyState) VK_RCONTROL Right Ctrl key (only used with GetAsyncKeyState and GetKeyState) VK_LMENU Left Alt key (only used with GetAsyncKeyState and GetKeyState) VK_RMENU Right Alt key (only used with GetAsyncKeyState and GetKeyState) VK_PROCESSKEY Process key VK_ATTN Attn key VK_CRSEL CrSel key VK_EXSEL ExSel key VK_EREOF Erase EOF key VK_PLAY Play key VK_ZOOM Zoom key VK_NONAME Reserved for future use VK_PA1 PA1 key VK_OEM_CLEAR Clear key Последний раз редактировалось Admin, 07.10.2009 в 19:02. |
#7
|
|||
|
|||
Да какие там переменные... Просто координаты, которые у меня уже есть. типа, там, x=1450, а y=540 (у меня монитор 1680х1050).
Нашёл ещё один вариант: screendc = CreateDC('DISPLAY', '', '', 0); writeln(GetPixel(screendc,x,y)); DeleteDC(screendc); Теперь он выводит с неопределённой периодичностью разные 10-и или 9-и значные коды (почему, блин, десятизначные? Вряд ли там альфа канал): -1308549988 (да-да, именно минус) 855712513 1828791009 1828791009 1241588222 855712513 1241588222 (всё в хронологическом порядке). Привожу полный текст проги (тестовой, чисто проверить): Код:
program Cvet; {$APPTYPE CONSOLE} uses SysUtils, windows; var a,b:integer; screendc: HDC; begin readln(a,b); sleep(3000); setcursorpos(a,b); sleep(500); screendc:= CreateDC('DISPLAY', '', '', 0); writeln(GetPixel(screendc,a,b)); DeleteDC(screendc); readln; end. Последний раз редактировалось Admin, 07.10.2009 в 19:02. |
#8
|
|||
|
|||
Подождите, сейчас попробую.
Кстати, я имел в виду не только на форме, но и в любой другой точке (если вы так и на писали, то извините, сейчас я проверю). Последний раз редактировалось Iskander, 07.10.2009 в 18:44. |
#9
|
||||
|
||||
именно в любой точке
|
#10
|
||||
|
||||
Выношу обоим замечание по оформлению кода, далее последуют санкции...
|
#11
|
||||
|
||||
Admin замечания? убеш что-ли? я особо за сайт не держусь просто помогаю программистам и будующим программистам мож они в дальнейшем создадут легендарные программы а сайт у меня есть свой
и аккаунт мой можешь УДАЛИТЬ by |
#12
|
|||
|
|||
А можно реализовать всё это чисто в консольном режиме?
Всякие, там, дескрипторы окон, затем получить DC и через Getpyxel(HDC,x,y). А за команды эмуляции спасибо большое. А вот сама форма пока не получилась, но я сам разберусь (просто я недолюбливаю графический интерфейс). У меня даже в строке Цитата:
Вылезает Undeclared Identifier 'Handle' Последний раз редактировалось Iskander, 07.10.2009 в 19:26. |
#13
|
||||
|
||||
Цитата:
если ты хочеш перевести все чисто в паскаль то там немного другие команды |
#14
|
|||
|
|||
Жаль. Спасибо огромное.
|
#15
|
||||
|
||||
Цитата:
ПС. Убивать не буду, просто попадешь на время в бан |