OldSchoolHack

Register / Login English

Verhalten von Input in Source-Games


icon Verhalten von Input in Source-Games #1

Join Date: Jul 2014

Posts: 12

User-Rating:

3 positive
0 negative
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 positive
0 negative
This post has been rated by:
KN4CK3R (Fri 25. Jul 2014, 18:18), k1u (Fri 25. Jul 2014, 18:42)
icon #2

Join Date: Aug 2007

Posts: 8646

User-Rating:

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

Quote
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

Join Date: Jul 2014

Posts: 12

User-Rating:

3 positive
0 negative
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

Join Date: Mar 2011

Posts: 978

User-Rating:

89 positive
6 negative
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

Quote from 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.
Quote from f4gsh0t_h4x
VAC ist an,immer,überall
Quote from gibson.w
Ich mag braune Würstchen
Quote from irc
<SilverDeath> KN4CK3R bistn nub
<~KN4CK3R> kk
Quote from 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
Quote from irc
<SilverDeath> Ich schwöre dir Dr_Pepper Ich bumms deine Mutter tot Mann!
<Dr_Pepper> danke.
<SilverDeath> bitte
Quote from 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)
Quote from 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

Join Date: Aug 2007

Posts: 8646

User-Rating:

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

__________________

Hallo
icon #6

Join Date: Jul 2014

Posts: 12

User-Rating:

3 positive
0 negative
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...

Only registered and activated users can see links.

Important  Do not use the Only registered and activated users can see links. or Only registered and activated users can see links. 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. }


Last edited by Jules19 (Fri 25. Jul 2014, 19:09)

Reason: no reason given

icon #7

Join Date: Jul 2014

Posts: 12

User-Rating:

3 positive
0 negative
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. }
Last edited by Jules19 (Fri 25. Jul 2014, 21:11)

Reason: verbessert

1 positive
0 negative
This post has been rated by:
KN4CK3R (Sat 26. Jul 2014, 00:37)
icon #8

Join Date: Aug 2007

Posts: 8646

User-Rating:

199 positive
33 negative
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
Last edited by KN4CK3R (Sat 26. Jul 2014, 00:41)

Reason: no reason given

1 positive
0 negative
This post has been rated by:
Jules19 (Sat 26. Jul 2014, 03:20)