PDA

Просмотр полной версии : Как нажать клавишу в свернутом PW?


gurin
15.02.2011, 19:33
Доброе время суток. Написал маленькую прогу, которая кушает банки, в случае если ХП или МЭ меньше заданного значения. Больше она ничего не делает.

Все прекрасно работает, но... Только если PW активно. Если не активно, то то программное нажатие клавиши не срабатывает.
Может подскажете чего?

Вот код что я использую:


PostMessage(hw, WM_KEYDOWN, VK_F7, 0);
Sleep(200);
PostMessage(hw, WM_KEYUP, VK_F7, 0);
Sleep(200);


работает только если PW активно

пробовал так


SetForegroundWindow(hw);
PostMessage(hw, WM_KEYDOWN, VK_F7, 0);
Sleep(200);
PostMessage(hw, WM_KEYUP, VK_F7, 0);
Sleep(200);


работает, но текущее приложение теряет фокус


пробовал так


hfw := getForegroundWindow;
SetForegroundWindow(hw);
PostMessage(hw, WM_KEYDOWN, VK_F7, 0);
Sleep(200);
PostMessage(hw, WM_KEYUP, VK_F7, 0);
Sleep(200);
SetForegroundWindow(hfw);


работает только если PW активно

перерыл весь интернет, ничего путнего не нашел :(

Просьба не обходиться общими словами, а, если нетрудно, приложить рабочий код. Заранее благодарен всем кто откликнется.

Добавлено через 2 минуты
Сорри, забыл указать, PW - это игра Perfect World.

VeTaL_UA
15.02.2011, 21:24
Ты также забыл сказать на каком языке ты это написал) Судя логике - это автоит) Через пять минут попробую что-то написать по теме!

Добавлено через 25 минут
Попробуй вот это, хотя я не уверен, что получится...
; вытягиваешь из процеса ид...
$Window = _ProcessGetWindow("ElementClient.exe", 1)
ConsoleWrite($Window & @CRLF)

Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf

finkrer
15.02.2011, 21:52
PW - это игра Perfect World.
Да ты что!

Kitsune
15.02.2011, 21:56
gurin, разморозить надо клиент, а потом можно будет посылать кнопки в свернутое и завернутое окно /problem.

FreePVP)))
15.02.2011, 22:14
TBX1n, а можно без разморозки?

Dinmaite
15.02.2011, 22:37
Можно, немного подправив функцию принятия WinMsg клиентом.

gurin
16.02.2011, 01:00
Ты также забыл сказать на каком языке ты это написал)

Это Delphi.

Что касаемо предложенного кода, я его не оч понял. Но насколько я понял в нем нет посылки кода клавиши в приложение, а PID я и так выцепляю и всю другую инфу след образом:


hw := FindWindow(nil, pChar(eClientCaption.text));
pidw := GetWindowThreadProcessId(hw, PID);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);


разморозить надо клиент

А примерчик можно как это сделать?

Добавлено через 12 минут
почитал я про разморозку... её применение приведет к вылету клиента через определенное время - так?

Добавлено через 1 час 7 минут
Может как-то можно вызвать программно использование ячеек панелей управления в игре?

Kitsune
16.02.2011, 02:29
приведет к вылету клиента через определенное время - так?
нет.

Может как-то можно вызвать программно использование ячеек панелей управления в игре?
нет.

А примерчик можно как это сделать?
или менять флаг заморозки через определенный интервал времени или изменить функцию смены флага в памяти клиента так, чтобы она всегда записывала 1 или ничего не записывала вовсе.

gurin
17.02.2011, 13:28
Помогло.

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

P.S. а где кнопка спасибо? не нашел что бы поблагодарить.

Хакерок:)
19.02.2011, 19:08
P.S. а где кнопка спасибо? не нашел что бы поблагодарить.
Появится после набора 10 сообщений...