PlayGround.ru
Ropnet
, купить игру Defiance (2013), Black Mesa mod, Jagged Alliance 2: Агония власти дата выхода


Привязка курсора к окну d2

LGt_Justice   29 марта 2012 в 17:45

Написал маленькую прогу на былдере, мб кому пригодится. Очень удобно например соркой летать, экономится время (так как всегда летаем на чуть большее расстояние).
ifolder.ru/29607498
Как юзать:
Запускаем exe, тыкаем lock. У вас есть секунда, чтобы навести курсор на окно, к которому нужно привязать курсор. Чтобы вернуть всё назад, табаемся в прогу и жмем enter.
Работает на 7-ке, насчет других ОС - не знаю).

LGt_Justice   29 марта 2012 в 18:00

#include
#pragma hdrstop
#include "Unit1.h"
#include
#include
#pragma package(smart_init)
#pragma resource "*.dfm"
using namespace std;
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
RECT rcClip;
RECT rcOldClip;
HWND Wnd;
tagPoint Pos;
RECT Rect;
bool u1 = false;
std::string s;
AnsiString name = ExtractFilePath(Application->ExeName)+"pos.ini";

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (!u1) {
u1 = true;
Button1->Caption = "Unlock";
Sleep(1000);
GetClipCursor(&rcOldClip);
GetCursorPos(&Pos);
Wnd = WindowFromPoint(Pos);
Timer1->Enabled = true;
} else {
u1 = false;
Button1->Caption = "Lock";
Timer1->Enabled = false;
ClipCursor(&rcOldClip);
Label5->Caption = rcOldClip.left;
Label6->Caption = rcOldClip.top;
Label7->Caption = rcOldClip.right;
Label8->Caption = rcOldClip.bottom;
}
}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
GetWindowRect(Wnd, &rcClip);
rcClip.left = rcClip.left + 5;
rcClip.right = rcClip.right - 5;
rcClip.top = rcClip.top + 29;
rcClip.bottom = rcClip.bottom -5;
ClipCursor(&rcClip);
Label5->Caption = rcClip.left;
Label6->Caption = rcClip.top;
Label7->Caption = rcClip.right;
Label8->Caption = rcClip.bottom;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ifstream in;
int r;
in.open(name.c_str());
for (;in.peek()!=EOF;)
{
in>>r;
Form1->Left = r;
in>>r;
Form1->Top = r;
}
in.close();
}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
ofstream in(name.c_str(),ios_base::in | ios_base::out | ios_base::trunc);
in << Form1->Left;
in << "\n";
in << Form1->Top;
in.close();
}

Obsessed   29 марта 2012 в 18:01

t.A.T.u., а то, что любые сторонние прожки запрещены, не смущаэ? %) Одмен одобряэ? ;)

malloc   29 марта 2012 в 18:02

nu tak-to eta proga ne chit

LGt_Justice   29 марта 2012 в 18:02

типо привязка к окну это чит?) xD

malloc   29 марта 2012 в 18:04

Sleep(1000);
ShowMessage("u vas 5 sekund chtobi zalochit okno");
Sleep(5000);

vot tak norm mb :D

LGt_Justice   29 марта 2012 в 18:06

ну сам скомпиль как хош если надо

Obsessed   29 марта 2012 в 18:30

типо привязка к окну это чит?) xD
LGt_Justice, ни в коем разе. просто на моей работе, например, "чит" - это то, что Москва назвала читом..

Enceladus from Nowhere   29 марта 2012 в 19:13

Отступы большие, кажется. Когда я себе такую штуку делал - ставил 3/22 (это был AHK/WinGetPos и стандартный Aero, если что. Про XP уже не помню - мб там заголовок и более узкий был).
Т.е., по-хорошему, их надо делать конфигурируемыми.

malloc   29 марта 2012 в 21:51

Вот аналог такой же проги, только написанной на си:
Link. Запускаем прогу. Видим, что начался поиск окна д2. Запускаем д2, ждем до появления Messagebox`a, нажимаем Enter и играем. Чтобы сделать все назад, переключаемся на прогу, вводим любой символ и нажимаем Enter или просто нажимаем Ctrl+C.

Enceladus from Nowhere   29 марта 2012 в 22:52

Вот аналог такой же проги, только написанной на си:
Как минимум, ты передаёшь ClipCursor() неизменным тот RECT, что получаешь от GetWindowRect(). А это значит, что у тебя курсор может попадать на рамку или заголовок окна, что очень неприятно. Потому и нужны отступы.
А вообще, проще сразу юзать AHK, который именно для подобных вещей и предназначен (правда, синтаксис тамошнего скриптового языка не всякому придется по вкусу). И "конфигурировать" легко. Просто открыл текстовичок со скриптиком - и поменял значения отступов, тайтл и т.д.

Midollo   29 марта 2012 в 23:05

y TC poka luchshe proga chem y tatu izza otstupov i kursor ne zavisaet esli silno uvesti vbok vse good rabotaet, no na shet "konfigurirovat"(kak napisal Enceladus) bilo b neploxo.
P.S. Enceladus ti ne mog bi vilozhit svoi variant, esli tebe ne slozhno ?

malloc   29 марта 2012 в 23:18

izza otstupov i kursor ne zavisaet
Пофиксил и обновил код. =)

Midollo   29 марта 2012 в 23:30

vo teper ochen kruto stalo, thx Tatu, sei chas y tebya good proga poluchilas :)

Midollo   29 марта 2012 в 23:34

2 t.A.T.u.
A mozhesh sdelat chto b tvoe okno eto gde nibyd v storonke bilo vnizy ? chtob ne meshalo ili chtob ono rabotalo v svernutom sostoianii, takoe realno ?

malloc   29 марта 2012 в 23:42

ana94
seichas proga eshe gosee(s autodetectom d2). prosto zapusti, sverni progu, podojdi 5 sekund, najmi enter i igrai. rghost.ru/37303489 - link

malloc   29 марта 2012 в 23:46

a esli need zapuskat' v svernutom sostoyanii, sozdai yarlik na rabochii stol(ili v drugoe mesto). na yarlike pravoi knopkoi -> svoistva -> okno -> svernutoe v znachok -> ok. teper' ona budet zapuskatsa v svernutom sostoyanii

Midollo   29 марта 2012 в 23:53

Ваще Госу, спс давно себе такую прогу искал, прям "под заказ" :)

Enceladus from Nowhere   30 марта 2012 в 01:10

P.S. Enceladus ti ne mog bi vilozhit svoi variant, esli tebe ne slozhno ?
Мой вариант - маленький скрипт для AHK. Сейчас у меня на этом компе его нет, так что просто расскажу - что он делал. Работал он просто - искал окно по тайтлу и получал его rect при помощи WinGetPos (как я уже писал). Этот rect уменьшался согласно заданным отступам и подавался на вход ClipCursor() при помощи DllCall. Включался по сочетанию клавиш ctrl + shift + f11, выключался по ctrl + shift + f12. Элементарно, короче. :}

malloc   30 марта 2012 в 01:16

искал окно по тайтлу
vsegda ishu okno po classu ;[

malloc   30 марта 2012 в 01:17

ibo v title mojet mnogo vsyakoi chepuhi bit' napisano, kotoruyu len' pisat' v kod

Enceladus from Nowhere   30 марта 2012 в 02:26

vsegda ishu okno po classu ;[ ibo v title mojet mnogo vsyakoi chepuhi bit' napisano, kotoruyu len' pisat' v kod
Ага. А может и не быть - это больше от тебя зависит. В принципе, это второстепенные детали реализации. Как я уже писал, в AHK вызов WinGetPos сразу тебе и окно ищет, и rect получает. Т.е. тупо короче получается просто искать по тайтлу. В моём случае искать по классу не было особого профита. :]

LGt_Justice   30 марта 2012 в 05:05

rghost.ru/37306282
обновил если кому надо
вот содержимое pos.ini:
-расстояние верхней левой точки формы окна от левого края экрана в пикселах
-расстояние верхней левой точки формы окна от верхнего края экрана в пикселах
-задержка перед началом работы в миллисекундах
-отступ от левого края окна игры в пискелах
-отступ от правого края окна игры в пискелах
-отступ от верхнего края окна игры в пискелах
-отступ от нижнего края окна игры в пискелах
-заголовок формы программы без пробелов
-сворачивать ли форму программы после привязки курсора? (0 - нет, не 0 - да)
-запускать ли привязку сразу после запуска программы (0 - нет, не 0 - да)

qwerty1999   30 марта 2012 в 06:35

torum.
Мне кажется, они какую-то ерунду пишут.

Obsessed   30 марта 2012 в 07:02

qwerty1999, ещё Хаттер ;) он тоже кодер, видимо.. =(

malloc   30 марта 2012 в 07:26

omg noobs eto ne chit

malloc   30 марта 2012 в 07:32

LGt_Justice
почему размер проги такой огромный?(

LGt_Justice   30 марта 2012 в 07:45

это ж билдер (я релиз не делал) + там еще исходники лежат
а на c# чета WinAPI не работает, разбираться лень ^_^ думал сначала на нем написать

malloc   30 марта 2012 в 08:14

а на си все работает :D

LGt_Justice   30 марта 2012 в 08:55

вы сурковская пропаганда

tunecx   30 марта 2012 в 09:03

windows mouse capturer tolko dlja botov, mi juzaem custom chiti

malloc   30 марта 2012 в 09:17

надо послать код алеру, чтобы в патч вписал :D

LGt_Justice   30 марта 2012 в 10:11

можно еще по идее сделать при альттабе - если перешли на процесс diablo2.exe - привязывать в нему, если нет - отменять привязку
токо хз как :D

malloc   30 марта 2012 в 10:47

nu mb
if SetActiveWindow(handle formi)
{
ClipCursor(&rcClip);
}

LGt_Justice   30 марта 2012 в 10:49

окон то несколько обычно)

malloc   30 марта 2012 в 10:51

на несколько окон мб не выйдет

malloc   30 марта 2012 в 10:52

захват ведь только для одного окна