Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - dramster

Pages: 1 ... 3 4 [5] 6 7 ... 76
61
В Дельфи разбираюсь слабо, в Си еще хуже.
В Си соглашение dllexport, у Дельфи соглашение  stdcall, а равны ли они?

Да, скорее всего в этом и проблема была. Пол дня изучения и чтения форумов и статей. :( .
Есть выход, но в данном случае он не применим. долго объяснять и вспоминать почему.
Короче тырить функции из чужих длллок это плохо  :)... занимает много времени.
Кинул я дурное и начал писать сам. Вот первоначальный, и рабочий вариант
 http://crapware.aidf.org/forum/index.php?topic=5529.0  . Возможно кто-либо найдет недочеты и косяки

62
Не прошло и года, как у меня все-же получилось написать длл для общения с ком портом, а именно с ардуиномикро. По сравнению с командной строкой, работает шустро и незаметно.
При написании никаких дополнительных компонентов для работы с ком не использовал. С ними оказалось намного все сложнее.
Вобщем, пару вечеров, куча статей и форумов, вот первый, и вполне рабочий вариант.
Кто в теме, или вдруг загорится этой темой, код длл делфи10:
Code: (clickermann) [Select]
library micro_com;

uses    Windows, SysUtils;

//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;


type
  pIntArr = array[0..0] of Integer;
var
 DCB   : TDCB;
 hPort : THandle;
 port_num : integer;
 param : integer;
 byete_res: Cardinal;
 str : string;
 len : integer;
begin
   port_num := pIntArr(_mas^)[0];
   param := pIntArr(_mas^)[_size-1];

  // 1. Открываем файл
  hPort := CreateFile(PChar('COM'+IntToStr(port_num)), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  // 2. Контроль ошибок
  if hPort = INVALID_HANDLE_VALUE then begin
   // Обнаружена ошибка, порт открыть не удалось
   result := 1;
   exit;
  end;

  // 3. Чтение текущих настроек порта
 if GetCommState(hPort, DCB) then ;
  // 4. Настройки:
  // Скорость обмена
 DCB.BaudRate := 9600;
  // Число бит на символ
 DCB.ByteSize := 8;
  // Стоп-биты
 DCB.StopBits := 1;
  // Четность
 DCB.Parity   := 0;
  // Какая-то херь непонятная
 DCB.Flags := 20625;
  // 5. Передача настроек
 if not SetCommState(hPort, DCB) then begin{ошибка настройки порта}
   result := 2;
   exit;
 end;
  // 6. Настройка буферов порта (очередей ввода и вывода)
 if not SetupComm(hPort, 16, 16) then begin{ошибка настройки буферов}
   result := 3;
   exit;
 end;
  // 7. Сброс буферов и очередей
if PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then
 // 8. Запись в порт
 str := intToStr(param);
 len := Length(str);
 WriteFile(hPort, PChar(str)^, len*2, byete_res, nil);
  // 9. Закрытие порта
 CloseHandle(hPort);
 result := 5;
end;

//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin

end.

Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:
Code: (clickermann) [Select]
CALL ("micro_com.dll", $com, $val)
Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294 . Немного доработал его:
Code: (clickermann) [Select]
#include <Mouse.h>
#include <Keyboard.h>
 
unsigned long par = 0;
String instring = "";
int kmfunct = 0;
int x_cor = 0;
int y_cor = 0;
int mult = 0;
int inchar = 0;

void setup() {
  Serial.begin(9600);
  Mouse.begin();
  Keyboard.begin();
 
}
 
void loop() {


while(Serial.available() > 0){ 
inchar = Serial.read();
if (isDigit(inchar)) {
   instring += (char)inchar;     
    }   
}   
  par = instring.toInt();
  instring = "";


    if (par > 0) {
     
     kmfunct =  par/16777216 ;
     switch (kmfunct) {
 
     case 1:  //Mouse.click
      Mouse.click(par - kmfunct*16777216);
      break;   
     case 2:  //  Mouse.move
      x_cor = (par - kmfunct*16777216)/256;
      y_cor = par - x_cor*256 - kmfunct*16777216;
      if (x_cor > 127) x_cor = 127 - x_cor;
      if (y_cor > 127) y_cor = 127 - y_cor;
      Mouse.move(x_cor, y_cor, 0);
      break;
     case 3: //Mouse.press
      Mouse.press(par - kmfunct*16777216);
      break;
     case 4: //Mouse.release
      Mouse.release(par - kmfunct*16777216);
      break;
     case 5:  //Mouse.dblclick
      Mouse.click(par - kmfunct*16777216);
      delay(50);
      Mouse.click(par - kmfunct*16777216);
      break;
     case 6: //wheel.down.up
      mult = par - kmfunct*16777216;
      if (mult > 127) mult = 127 - mult;
      Mouse.move(0, 0, mult);
     case 7: // Keyboard.keydown
      Keyboard.press(par - kmfunct*16777216);
      break;
     case 8: // Keyboard.keyup
      Keyboard.release(par - kmfunct*16777216);
      break;
     case 9: // Keyboard.keypress
      Keyboard.write(par - kmfunct*16777216);
      break;
     }
    }
    par = 0;
 
}


Библиотека с подпрограммами для кликермана тут:
Code: (clickermann) [Select]
$com = 5   //свой порт

//#name "Arduino_mouse&keyboard"
 
////////////////////////////////////////////////
 
// Все процедуры с мышью и клавиатурой через ардуино
 
//micro_move ($x_cor, $y_cor)
//micro_lclick ($x_cor, $y_cor)
//micro_rclick ($x_cor, $y_cor)
//micro_mclick ($x_cor, $y_cor)
//micro_ldown ($x_cor, $y_cor)
//micro_rdown ($x_cor, $y_cor)
//micro_mdown ($x_cor, $y_cor)
//micro_lup ($x_cor, $y_cor)
//micro_rup ($x_cor, $y_cor)
//micro_mup ($x_cor, $y_cor)
//micro_dblclick ($x_cor, $y_cor)
//micro_wheeldown ($mult)
//micro_wheelup ($mult)
 
// вместо $char_ASCII писать не код клавиши, а символ ASCII.
// в ардуино как-то тупо сделали клавиатурные нажатия :/
//micro_keydown ($char_ASCII)
//micro_keyup ($char_ASCII)
//micro_keypress ($char_ASCII)
 
 
 
//move
SUB(micro_move, $x_cor, $y_cor)
 
   WHILE(DIST($x_cor, $y_cor, $_xmouse, $_ymouse) > 3)
 
      $x_temp = $_xmouse
      $y_temp = $_ymouse
 
      $x_dist = $x_cor - $_xmouse
      $y_dist = $y_cor - $_ymouse
 
      IF($x_dist < 0)
         $x_dist = 127 + int(SQRT(abs($x_dist*4)))
      else
         $x_dist =  int(SQRT(abs($x_dist*4)))
      END_IF
      IF($y_dist < 0)
         $y_dist = 127 + int(SQRT(abs($y_dist*4)))
      else
         $y_dist =  int(SQRT(abs($y_dist*4)))
      END_IF
      CALL ("micro_com.dll", $com, 33554432 + $x_dist*256 + $y_dist) 
     
   END_CYC
END_SUB

//lclick
SUB(micro_lclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 16777217)
END_SUB
 
//rclick
SUB(micro_rclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 16777218)
END_SUB
 
//mclick
SUB(micro_mclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 16777219)
END_SUB
 
//ldown
SUB(micro_ldown, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 50331649)
END_SUB
 
//rdown
SUB(micro_rdown, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 50331650)
END_SUB
 
//mdown
SUB(micro_mdown, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 50331651)
END_SUB
 
//lup
SUB(micro_lup, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 67108865)
END_SUB
 
//rup
SUB(micro_rup, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 67108866)
END_SUB
 
//mup
SUB(micro_mup, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 67108867)
END_SUB
 
//dblclick
SUB(micro_dblclick, $x_cor, $y_cor)
   micro_move($x_cor, $y_cor)
   CALL ("micro_com.dll", $com, 83886081)
END_SUB
 
//wheeldown
SUB(micro_wheeldown, $mult)
   CALL ("micro_com.dll", $com, 100663423 + $mult)
END_SUB
 
//wheelup
SUB(micro_wheelup, $mult)
   CALL ("micro_com.dll", $com, 100663296 + $mult)
END_SUB
 
//keydown
SUB(micro_keydown, $char_ASCII)
   CALL ("micro_com.dll", $com, 117440512 + code($char_ASCII))
END_SUB
 
//keyup
SUB(micro_keyup, $char_ASCII)
   CALL ("micro_com.dll", $com, 134217728 + code($char_ASCII))
END_SUB
 
//keypress
SUB(micro_keypress, $char_ASCII)
   CALL ("micro_com.dll", $com, 150994944 + code($char_ASCII))
END_SUB

Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной  ;).

Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно  впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.

Во вложении dll для х32 систем.


63
А если речь идет именно о коде страницы, то почему бы не использовать HTTPGET (url, [headers, ...] ) . Подробнее в справке. Если страница защищена https, то и тут есть выход - http://crapware.aidf.org/forum/index.php?topic=356.msg26057#msg26057

64
А ctrl+A ?
А сочетания клавиш работаю в режиме привязки или postmessage?
Смысл в том, что бы запустить скрипт и работать на машине.
В привязке работать не будет. А с postmessage ты уж сам не поленись, попробуй.

66
Файл alt_winmode.
строка 38 и 39.
Code: [Select]
//A_LUP
SUB(A_LUP, $A_x, $A_y, $A_hwnd)

Тут наверное ошибка, нужно заменить на

Code: [Select]
//A_RUP
SUB(A_RUP, $A_x, $A_y, $A_hwnd)
Заменил.

67
Общие вопросы / Re: каждый круг +1 нажатие
« on: January 25, 2021, 12:27:04 AM »
У тебя при использовании KEYPRESS залипает кнопка? Зачем ее еще раз отпускать KEYUP? "KEYPRESS - Нажимает и отпускает клавишу клавиатуры."

ребята  не  помню как  делать за  каждым кругом  скрипта +1  действие 
.......
вот етот кусок  но каждый круг +1 нажатие
Code: (clickermann) [Select]
KEYPRESS(#A)
WAITMS(50)
KEYUP(#A)
 


Code: (clickermann) [Select]
inc($count)  //наращиваем переменную
FOR($a=0,$a<$count)  //выполнится  $count раз
   KEYDOWN(#A)
   WAITMS(50)
   KEYUP(#A)
   WAITMS(200)
END_CYC

вместе:
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "отправить.bmp", -1, 100)
      $check = 1
      LCLICK($_return1, $_return2)
      WAITMS(100)
   ELSE
      WAITMS(50)
   END_IF
END_CYC
WAITMS(500)

GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "скрепка.bmp", -1, 100)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF
WAITMS(500)
LCLICK(313,190)  // 14414821

WAITMS(500)
LCLICK(793,509)  // 16511395
WAITMS(500)
LCLICK(1086,690)  // 134
WAITMS(500)
KEYDOWN(#ESC)
WAITMS(50)
KEYUP(#ESC)
WAITMS(500)
LCLICK(744,54)  // 16777215

//а в  конце
inc($count)  //наращиваем переменную
FOR($a=0,$a<$count)  //выполнится  $count раз
   KEYDOWN(#A)
   WAITMS(50)
   KEYUP(#A)
   WAITMS(200)
END_CYC

68
Общие вопросы / Re: Повторение скрипта
« on: January 25, 2021, 12:10:27 AM »
Можно ли добавить какой-то параметр отвечающий за количество CASE и то, какой из них будет стартовым?
Что-то вроде "Стартовый CASE" = 3, "Количество CASE"  = 3
и скрипт уже бы работал в режиме В, А, Б, В, А, Б, В, А, Б...
Хочу вывести эти два параметра в Окно ввода через inputbox, чтобы каждый раз не редактировать скрипт

Code: (clickermann) [Select]
IF($start_CASE = 0)  //начальные параметры
   $start_CASE = inputbox("Стартовый CASE", 1, 10)
   $amount_CASE = inputbox("Количество CASE", 4, 10)
END_IF

SWITCH($start_CASE)
   CASE(1)
      // случай 1
      print("А")
   CASE(2)
      // случай 2
      print("Б")
   CASE(3)
      // случай 3
      print("В")
   CASE(4)
      // случай 4
      print("Г")
   DEFAULT
      print("Недопустимые начальные параметры.")
      halt
END_SWITCH

IF($amount_CASE = $start_CASE) //возврат к началу, если параметр кол-ва кейсов сровнялся с последним в переключателе
   $start_CASE = 0
END_IF

inc($start_CASE) //наращиваем переменную



А теперь вопрос у меня:
Справка -  "DEFINE ($var, [value] ), инструкция сработает только если переменная не была объявлена раньше. В противном случае инструкция игнорируется."
Почему DEFINE ($start_CASE, inputbox("Стартовый CASE", 1, 10)) каждый раз вызывает inputbox?
Естественно это не критично, просто без лишних мыслей сперва написал именно так... не прокатило.

69
LDOWN (80,810) и LUP (80,810) это программное нажатие в активное окно. Чтобы клик сработал в неактивном окне, и курсор был свободен, нужно отправить окну системные сообщения, они в библиотеке "alt_winmode.cms" в подпрограммах A_LDOWN и A_LUP.

70
 Нашел я библиотеку dll для работы с ком портами https://www.kernelchip.ru/pcports/PS057.php. Ранее без проблем получалось писать dll на делфи для чтения функций из сторонних библиотек dll. Как пример вот эта тема http://crapware.aidf.org/forum/index.php?topic=4596.msg31508#msg31508 . Там я вызывал функцию как процедуру, и даже так прокатило. Были у меня и еще примеры использования функций из сторонней длл, все работало как часики.

 Но вот с этой библиотекой 'SerialGate.dll' что-то никак не вяжется. Выдает ошибку "Точка входа в процедуру 'имя ф-ции' не найдена в библиотеке DLL". То есть, якобы этой функции там нет  :(

 Там на сайте автора https://www.kernelchip.ru/pcports/PS057.php и https://www.kernelchip.ru/pcports/PS058.php и  https://www.kernelchip.ru/pcports/PS059.php есть исходники, но я в C++ полный ноль, да и в Delphi не ас.


 Если кто-то из читателей данной темы в курсе как там все работает, не пожалейте пару минут на общее благо. Гляньте по ссылкам и проверьте в чем моя ошибка. Хочу написать DLL для общения кликермана с arduino micro.

Мои попытки чтения функций из 'SerialGate.dll':
Code: (clickermann) [Select]
library cmann_plugin;

uses  SysUtils, Winapi.Windows;

function Open(port : integer; baud : integer) : boolean; stdcall; external 'SerialGate.dll'; //берем из 'SerialGate.dll' функцию 'Open'

//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
  port_input : integer;
  res : integer;
begin
  port_input := pIntArr(_mas^)[0]; //читаем параметр порта из кликермана

  if Open(port_input, 19200) then res := 1 else res := 2; //пытаемся открыть порт и результат сего действия возвращаем кликерману.

  result := res;

end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.

Спасибо всем заранее  :) .

71
Ничего не знаю  :D . Изначально была задача - "нужный текст кинуть в буфер обмена, но там должно быть не одна, а несколько строк.".

Из -
"Привет как дела. Все нормально."

должно получиться -
"Привет как дела.
Все нормально."

Решение - strconcat("Привет как дела", char(13), char(10), "Все нормально.")

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

73
Как работает через print("Привет как дела. Все нормально.")
Привет как дела. Все нормально.

Нужно
Привет как дела.
Все нормально.

print(strconcat("Привет как дела", char(13), char(10), "Все нормально."))
toclip(strconcat("Привет как дела", char(13), char(10), "Все нормально."))

74
В первую очередь нужно проверить стандартную привязку, если с ней проблемы, то тогда уже пробовать различные варианты. Если использование библиотеки "alt_winmode.cms" кажется сложнsv, либо она также не хочет работать, то можно воспользоваться виртуальной машиной.

Правильно так:
Code: (clickermann) [Select]
#include "alt_winmode.cms"
WAIT(2)
$hwnd = 262962
$check = 0
WHILE($check = 0)
//в данном примере нужно не забывать, что координаты беруться относительно верхнего левого угла окна
   A_GETSCREEN(0, 0, 1000, 500, $hwnd)
   A_IFPIXELIN(400, 80, 400, 80, 4722204, $hwnd) //если нужно проверить один пиксель, а не область, то правильнее проверить его с помощью функции A_PXL(x, y, hwnd) 
   IF($A_return1>0)
      A_LDOWN (80,810, $hwnd)
      WAITMS(RND(80,120))
      A_LUP (80,810, $hwnd)
      $check = 1
   ELSE
      WAIT(2)
   END_IF
END_CYC

HALT

"Не забываем, что все координаты вводить относительно верхнего левого угла окна.
Горячие клавиши alt+q в данном случае не помогут. Поможет команда A_CHECK_PXL(hwnd), которая запишет в лог нужные нам координаты и цвет пикселя под курсором."

75
Общие вопросы / Re: Фоновая работа
« on: January 14, 2021, 07:46:37 PM »
Все будет работать на мощностях моего компьютера, а кликер отдельно на 2м мониторе, не мешая работе мыши и клавиатуры на основном мониторе?

Именно так, кроме момента с работой мыши и клавиатуры. Но если в кликере мышь и клавиатура используется не часто, то можно извернуться так:
Code: (clickermann) [Select]
$x = $_xmouse  //записываем координаты курсора
$y = $_ymouse
LCLICK(552,600)    //кликаем
move($x, $y)    //возврат курсора в начальное место
WAIT(2)
В этом костыле есть небольшой минус, если физически интенсивно работать мышкай, то при клике кликерманом курсор может сдвинуться в месте клика. Для этого есть решение - отключать мышь и клавиатуру на момент клика кликерманом - http://crapware.aidf.org/forum/index.php?topic=4596.msg31508#msg31508
 block.dll в папку со скриптом.
Code: (clickermann) [Select]
$x = $_xmouse  //записываем координаты курсора
$y = $_ymouse
call("block.dll", 1)  //откл мышь
LCLICK(552,600)    //кликаем
call("block.dll", 0)  //вкл мышь
move($x, $y)    //возврат курсора в начальное место
WAIT(2)

Pages: 1 ... 3 4 [5] 6 7 ... 76