OldSchoolHack

Registrieren / Anmelden Deutsch

Verhalten von Input in Source-Games


icon Verhalten von Input in Source-Games #1

Anmeldungsdatum: Jul 2014

Beiträge: 12

Benutzer-Bewertung:

3 positiv
0 negativ
Hi,

ich verwende das OSHGui seit heute und muss sagen, dass es mir bisher gut gefällt. Einziges Problem was ich zurzeit noch habe: Ingame wird die Maus von der Engine immer wieder sofort zentriert, eine Bedienung ist unmöglich. Probleme mit Tastatureingaben konnte ich Ingame durch einen Hook von IBaseClientDLL::IN_KeyEvent umgehen. Das gilt jedoch leider nicht für die Menü-Ansicht (dort, wo man die Console sieht).

Wie löse ich dieses Problem am elegantesten? Soweit ich das sehe, wird der Windows Message Hook return bei den Inputs ignoriert, da der Hook für das Menü im D3D-Thread läuft, jedoch nicht im Input-Thread des Spiels.

Ideen sind:
a) Message Hook für den Input-Thread erstellen und einfach Eingabe- und Mauspositionsnachrichten droppen. Allerdings weiß ich nicht, ob das Menü dann noch funktioniert. Und es ist viel Aufwand, den richtigen Thread für die Inputverarbeitung zu finden.
b) Weiter in die Engine graben und versuchen, noch tiefere Funktionen als IBaseClientDLL::IN_KeyEvent zu finden (dürfte machbar sein). Allerdings behebt das nicht das Problem mit der Maus.

Vielen Dank schon mal im Voraus für jegliche Hilfe :-)

(Sorry, falls ich im falschen Forum bin; aber im übergeordneten Forum kann ich leider keine Beiträge erstellen?)

2 positiv
0 negativ
Dieser Beitrag wurde bewertet von:
KN4CK3R (Fr 25. Jul 2014, 18:18), k1u (Fr 25. Jul 2014, 18:42)
icon #2

Anmeldungsdatum: Aug 2007

Beiträge: 8646

Benutzer-Bewertung:

199 positiv
33 negativ
Ich hab mich damit noch nicht genauer beschäftigt und hab das Problem beim OSHFusion "per Readme" gelöst, in der steht:

Zitat
Q: Warum kann ich die Maus im Menü nicht bewegen?
A: Viele Spiele blockieren die Maus während des Spielens. Öffne einfach ein Spielmenu, dann kannst du die Maus meistens bewegen.

Früher hab ich das in CSS so gemacht:
CPP Code:
  1.  
  2. Point backup;
  3. bool WINAPI new_SetCursorPos(int x, int y)
  4. {
  5. backup.X = x;
  6. backup.Y = y;
  7.  
  8. if (gui.drawgui)
  9. return true;
  10.  
  11. return pSetCursorPos(x, y);
  12. }
  13. //---------------------------------------------------------------------------
  14. bool WINAPI new_GetCursorPos(LPPOINT actpoint)
  15. {
  16. bool getret = pGetCursorPos(actpoint);
  17.  
  18. if (gui.draw)
  19. {
  20. ScreenToClient(GetForegroundWindow(), actpoint);
  21. gui.mouse.X = actpoint->x;
  22. gui.mouse.Y = actpoint->y;
  23. actpoint->x = backup.X;
  24. actpoint->y = backup.Y;
  25. }
  26.  
  27. return getret;
  28. }
  29. //---------------------------------------------------------------------------

__________________

Hallo
icon #3

Anmeldungsdatum: Jul 2014

Beiträge: 12

Benutzer-Bewertung:

3 positiv
0 negativ
So habe ich das früher auch gemacht. Ich dachte, das geht eleganter. Ich werde mal was basteln und die Lösung hier posten.
icon #4

Anmeldungsdatum: Mär 2011

Beiträge: 978

Benutzer-Bewertung:

89 positiv
6 negativ
benutz als inputsource net den cursor, sondern directinput, dann einfafch den echten mauscursor bei bedarf ausblenden und eigenen zeichnen (weiß net, ob oshgui das net eh schon tut).

__________________

http://www.abload.de/img/signfj5o.png
Spoiler
Vids:
Zitate:
Spoiler

Zitat von xst
Vater KN4CK3R, der du hängst im irc, geheiligt werde dein Botnet, dein P7 v1.337 komme, die Bannwelle geschehe, wie in CS:S als auch in CS:GO, führe uns nicht in Versuchung, sondern erlöse uns von all dem c+p-Shit.
Zitat von f4gsh0t_h4x
VAC ist an,immer,überall
Zitat von gibson.w
Ich mag braune Würstchen
Zitat von irc
<SilverDeath> KN4CK3R bistn nub
<~KN4CK3R> kk
Zitat von irc
<OrkSchamane> das prob is das viele dieser eig. recht guten bücher englisch sind ...
<OrkSchamane> da habe ich's ja doppelt schwer
<~KN4CK3R> falsch
<~KN4CK3R> das prob is dass du programmieren willst ohne englisch zu können
Zitat von irc
<SilverDeath> Ich schwöre dir Dr_Pepper Ich bumms deine Mutter tot Mann!
<Dr_Pepper> danke.
<SilverDeath> bitte
Zitat von irc
<~KN4CK3R> dann liegts wenigstens an mir
<~KN4CK3R> nur noch rausfinden warum -.-
<SilverDeath> ja sicher
<SilverDeath> an wem sonst?
* You were kicked by KN4CK3R (kick)
Zitat von Dr_Pepper
ihr seit beide dumm
Tutorials:
Releases:
Gifs:
Spoiler
http://www.abload.de/img/uberesp2sgul2.gif
https://i.imgur.com/Z5VQMrV.gif
http://www.abload.de/img/minesweeperzgaef.gif
icon #5

Anmeldungsdatum: Aug 2007

Beiträge: 8646

Benutzer-Bewertung:

199 positiv
33 negativ
Nur wenn mans selbst als Trigger einbaut. Und ne DirektInput Input Klasse wollteste schon laaaaange machen!

__________________

Hallo
icon #6

Anmeldungsdatum: Jul 2014

Beiträge: 12

Benutzer-Bewertung:

3 positiv
0 negativ
Gerade in der MSDN gefunden btw. Du tust aber genau das in der WindowsMessage.cpp ;-)

OSHGui zeichnet den Cursor selber. Trotzdem buggt es zurzeit noch heftig, der Cursor bewegt sich nicht mehr wenn ich SetCursorPos hooke. Ich schaue mal weiter...

Um Links zu sehen, musst du dich registrieren

Important  Do not use the Um Links zu sehen, musst du dich registrieren or Um Links zu sehen, musst du dich registrieren macros to extract the x- and y- coordinates of the cursor position because these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x- and y- coordinates, and LOWORD and HIWORD treat the coordinates as unsigned quantities.

Aktueller Ansatz:


TEXT Code:
  1.  
  2. BOOL WINAPI Gui::SetCursorPos(int X, int Y)
  3. {
  4. Implode::Gui->mousePos_ = { X, Y };
  5.  
  6. if (Application::Instance()->IsEnabled() && SDK::Engine->IsConnected() && SDK::Engine->IsInGame() && !SDK::Engine->Con_IsVisible() && !SDK::Engine->IsLevelMainMenuBackground())
  7. {
  8. Application::Instance()->ProcessMouseMessage(MouseMessage(MouseMessage::Move, MouseButton::None, Drawing::Point(X, Y), 0));
  9. }
  10.  
  11. return Implode::Gui->hookSetCursorPos_(X, Y);
  12. }


Zuletzt geändert von Jules19 (Fr 25. Jul 2014, 19:09)

Grund: kein Grund angegeben

icon #7

Anmeldungsdatum: Jul 2014

Beiträge: 12

Benutzer-Bewertung:

3 positiv
0 negativ
Hab's. Ich poste mal mein Resultat. Danke für eure Hilfe!

@Knacker, da ich mich nun intensiver mit dem OSHGui beschäftigen werde und sicher Bugs finden werde: hast du inzwischen einen Tracker oder soll das hier ins Forum? (nutze den letzten Trunk)

TEXT Code:
  1. void Gui::Toggle()
  2. {
  3.     auto app = Application::Instance();
  4.  
  5.     int width, height;
  6.     SDK::Engine->GetScreenSize(width, height);
  7.  
  8.     POINT result;
  9.  
  10.     if (app->IsEnabled())
  11.     {
  12.         hookGetCursorPos_(&mousePosOpen_);
  13.         result = { width / 2, height / 2 };
  14.  
  15. ClientToScreen(GetForegroundWindow(), &result);
  16.     }
  17.     else
  18.     {
  19.         result = mousePosOpen_;
  20.     }
  21.  
  22.     hookSetCursorPos_(result.x, result.y);
  23.     app->Toggle();
  24. }
  25.  
  26. class ErsteForm : public Form
  27. {
  28. private:
  29.     Button *ersterButton;
  30.     void InitializeComponent()
  31.     {
  32.         this->SetText("ErsteForm");
  33.         ersterButton = new Button();
  34.         ersterButton->SetText("klick mich");
  35.         ersterButton->GetClickEvent() += ClickEventHandler(std::bind(&ErsteForm::ersterButton_Click, this, std::placeholders::_1));
  36.         this->AddControl(ersterButton);
  37.     }
  38. public:
  39.     ErsteForm()
  40.     {
  41.         InitializeComponent();
  42.     }
  43. private:
  44.     void ersterButton_Click(Control *sender)
  45.     {
  46.         MessageBox::Show("Ich wurde angeklickt!");
  47.     }
  48. };
  49.  
  50. HRESULT WINAPI Gui::EndScene(LPDIRECT3DDEVICE9 pDevice)
  51. {
  52.     Application *app = Application::Instance();
  53.  
  54.     if (!Implode::Gui->initialized_)
  55.     {
  56.         Implode::Gui->initialized_ = true;
  57.         Implode::Gui->messageHookHandle_ = SetWindowsHookExW(WH_GETMESSAGE, MessageHook, 0, GetCurrentThreadId());
  58.  
  59.         app->Create(new Drawing::RendererDX9(pDevice));
  60.  
  61.         int width, height;
  62.         SDK::Engine->GetScreenSize(width, height);
  63.         app->GetRenderer()->SetRenderRectangle(Drawing::Rectangle(0, 0, width, height));
  64.  
  65.         app->Run(std::shared_ptr<Form>(new ErsteForm()));
  66.     }
  67.  
  68.     if (SDK::Engine->IsConnected() && SDK::Engine->IsInGame() && !SDK::Engine->Con_IsVisible() && !SDK::Engine->IsLevelMainMenuBackground())
  69.     {
  70.         app->GetRenderer()->Begin();
  71.         Implode::ClientHooks->EndScene(pDevice, app->GetRenderer());
  72.         app->Render();
  73.         app->GetRenderer()->End();
  74.     }
  75.  
  76.     return Implode::Gui->hookEndScene_(pDevice);
  77. }
  78.  
  79. LRESULT CALLBACK Gui::MessageHook(int code, WPARAM wParam, LPARAM lParam)
  80. {
  81.     if (lParam & 0x80000000 || lParam & 0x40000000)
  82.     {
  83.         return CallNextHookEx(Implode::Gui->messageHookHandle_, code, wParam, lParam);
  84.     }
  85.  
  86.     if (code == HC_ACTION)
  87.     {
  88.         if (reinterpret_cast<LPMSG>(lParam)->message == WM_MOUSEMOVE)
  89.         {
  90.             return 0;
  91.         }
  92.  
  93.         if (Implode::Gui->input_.ProcessMessage(reinterpret_cast<LPMSG>(lParam)))
  94.         {
  95.             return 1;
  96.         }
  97.     }
  98.  
  99.     return CallNextHookEx(Implode::Gui->messageHookHandle_, code, wParam, lParam);
  100. }
  101.  
  102. BOOL WINAPI Gui::SetCursorPos(int X, int Y)
  103. {
  104.     Implode::Gui->mousePos_ = { X, Y };
  105.  
  106.     if (Application::Instance()->IsEnabled() && SDK::Engine->IsConnected() && SDK::Engine->IsInGame() && !SDK::Engine->Con_IsVisible() && !SDK::Engine->IsLevelMainMenuBackground())
  107.     {
  108.         POINT point;
  109.  
  110.         Implode::Gui->hookGetCursorPos_(&point);
  111.         ScreenToClient(GetForegroundWindow(), &point);
  112.         Application::Instance()->ProcessMouseMessage(MouseMessage(MouseMessage::Move, MouseButton::None, Drawing::Point(point.x, point.y), 0));
  113.  
  114.         return 0;
  115.     }
  116.  
  117.     return Implode::Gui->hookSetCursorPos_(X, Y);
  118. }
  119.  
  120. BOOL WINAPI Gui::GetCursorPos(LPPOINT lpPoint)
  121. {
  122.     auto active = Implode::Gui->hookGetCursorPos_(lpPoint);
  123.  
  124.     if (Application::Instance()->IsEnabled() && SDK::Engine->IsConnected() && SDK::Engine->IsInGame() && !SDK::Engine->Con_IsVisible() && !SDK::Engine->IsLevelMainMenuBackground())
  125.     {
  126.         lpPoint->x = Implode::Gui->mousePos_.x;
  127.         lpPoint->y = Implode::Gui->mousePos_.y;
  128.     }
  129.  
  130.     return active;
  131. }
  132.  
  133. int __fastcall ClientHooks::IN_KeyEvent(void *pThis, int edx, int eventcode, ButtonCode_t keynum, const char *pszCurrentBinding)
  134. {
  135.     if (keynum == ButtonCode_t::KEY_INSERT && eventcode)
  136.     {
  137.         Implode::Gui->Toggle();
  138.     }
  139.  
  140.     if (OSHGui::Application::Instance()->IsEnabled())
  141.     {
  142.         return 0;
  143.     }
  144.  
  145.     return Implode::ClientHooks->vmtManager_->GetMethod<IN_KeyEvent_t>(OffsetIN_KeyEvent)(pThis, eventcode, keynum, pszCurrentBinding);
  146. }
Zuletzt geändert von Jules19 (Fr 25. Jul 2014, 21:11)

Grund: verbessert

1 positiv
0 negativ
Dieser Beitrag wurde bewertet von:
KN4CK3R (Sa 26. Jul 2014, 00:37)
icon #8

Anmeldungsdatum: Aug 2007

Beiträge: 8646

Benutzer-Bewertung:

199 positiv
33 negativ
Nein, gibt keinen Tracker. Und du solltest besser nicht /trunk benutzen, sondern den branch /newrenderer. /trunk wird in absehbarer Zeit dadurch ersetzt werden, also lieber früher als später umsteigen.

Falls du auch das VisualGUI benutzt, gibts davon auch einen Branch für die neue Version.

Bei Fragen zur Umstellung, kannst du hier im Forum fragen oder ne PN schreiben. Tutorials zur neuen Version gibts leider noch keine, aber im Projects Ordner ist ein Sample Projekt, das die meisten Fragen beantworten sollte.

__________________

Hallo
Zuletzt geändert von KN4CK3R (Sa 26. Jul 2014, 00:41)

Grund: kein Grund angegeben

1 positiv
0 negativ
Dieser Beitrag wurde bewertet von:
Jules19 (Sa 26. Jul 2014, 03:20)