[Alt & Kaputt] Borderless Windowmode, Window Message...

Übersicht BlitzBasic DLLs und Userlibs

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: [Alt & Kaputt] Borderless Windowmode, Window Message...

BeitragSo, Aug 29, 2010 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Neue Userlib + DLL!

Zitat:
Ich habe begonnen diese Funktionen öffentlich zu machen, bitte siehe weiter unten in diesem Thread.
Warum öffentlich? Einer DLL sieht man an wo, wie und wann diese erstellt wurde. Nehmen wir als Beispiel mal Starfare: Starfare nutzt(e) diese DLL um Borderless Windowmode zu haben, aber der Autor vergaß das DLLs einen Header besitzen. Somit liegt bei dem Projekt eine DLL bei die sich ffscreen.dll nennt, aber in wirklichkeit ColoredWorld.dll heißt(wie man es dem edata Header entlesen kann). Zusätzlich dazu kann Text nicht einfach verschwinden und man lernt etwas daraus.





Zitat:
Mit dieser DLL könnt ihr euch die Primären Monitordaten holen um wie im Titel beschrieben Fake-Fullscreen zu erschaffen. Zusätzlich dazu hat die DLL noch nen CloseHandler drin, der ist aber in etwa derselbe wie BlitzClose hat.

DLL: https://www.blitzforum.de/upload/file.php?id=9934
Decls:Code: [AUSKLAPPEN]
.lib "ColoredWorld.dll"
InstallCloseHandler%(WindowName$):"InstallCloseHandler@4"
GetWindowClose%():"GetWindowClose@0"
UnInstallCloseHandler%():"UnInstallCloseHandler@0"
GetMainMonitorSize(Bank*):"GetMainMonitorSize@4"
CursorBounds(X%,Y%,W%,H%):"CursorBounds@16"

.lib "user32.dll"
api_GetWindowLong% (hwnd%, nIndex%) : "GetWindowLongA"
api_SetWindowLong% (hwnd%, nIndex%, dwNewLong%) : "SetWindowLongA"
api_SetWindowPos% (hwnd%, hWndInsertAfter%, x%, y%, cx%, cy%, wFlags%) : "SetWindowPos"
api_GetWindowRect% (hwnd%, Rect*) : "GetWindowRect"
api_GetClientRect% (hwnd%, Rect*) : "GetClientRect"
api_GetActiveWindow% () : "GetActiveWindow"
api_ClientToScreen% (hwnd%, Point*) : "ClientToScreen"

BB:BlitzBasic: [AUSKLAPPEN]
Function FakeFullscreen()
Local BlitzhWnd = SystemProperty("AppHwnd"), SizeBank = CreateBank(16)
GetMainMonitorSize(SizeBank)
Graphics3D PeekInt(SizeBank,8), PeekInt(SizeBank,12), 32, 3
api_SetWindowLong BlitzhWnd, -16, (api_GetWindowLong(BlitzhWnd,-16) Xor 12582912) Xor 8388608 Xor 262144
api_SetWindowPos BlitzhWnd, 0, PeekInt(SizeBank,0)-1, PeekInt(SizeBank,4)-1, PeekInt(SizeBank,8)+2, PeekInt(SizeBank,12)+2, 64
FreeBank SizeBank
End Function
Function LockPointerToWindow(Window=0)
If Window=0 Then Window = SystemProperty("AppHWND")
Local Bank = CreateBank(16), Bank2 = CreateBank(8)
api_ClientToScreen(HWND_Blitz, Bank2)
api_GetClientRect(HWND_Blitz, Bank)
CursorBounds(PeekInt(Bank,0)+PeekInt(Bank2,0),PeekInt(Bank,4)+PeekInt(Bank2,4),PeekInt(Bank,8),PeekInt(Bank,12))
FreeBank(Bank):FreeBank(Bank2)
End Function
Function ReleaseLock()
CursorBounds(0,0,-1,-1)
End Function


Funktionen:
Arrow InstallCloseHandler(WindowName$)
Verändert den WindowCallback um das klicken auf [X] nicht zum beenden zu bringen.
Arrow GetWindowClose()
Gibt zurück wie oft bereits das [X] gedrückt wurde. Nützlich um z.b. bei 2-fachen draufklicken die Abfrage zu überspringen.
Arrow UnInstallCloseHandler()
Setzt den WindowCallback wieder zurück.
Arrow GetMainMonitorSize(Bank)
Führt EnumDisplayMonitors aus, um den Primären Monitor um seine echte größe zu finden.
Arrow FakeFullscreen()
Erstellt einen Fake-Fullscreen Graphics3D.
Arrow LockPointerToWindow(Fenster%)
Sperrt die Maus auf ein bestimmtes Fenster. Fenster ist optional
Arrow ReleaseLock()
Lässt die Maus wieder frei.
Arrow CursorBounds(HWND,X,Y,W,H)
Sperrt die Maus anhand eines Fenster in einen Bereich.

So benutzt ihr es:
BlitzBasic: [AUSKLAPPEN]
FakeFullscreen()
InstallCloseHandler("")
LockPointerToWindow()
...
If GetWindowClose() Then UnInstallCloseHandler():ReleaseLock():End
  • Zuletzt bearbeitet von Xaymar am Do, Apr 30, 2015 1:34, insgesamt 7-mal bearbeitet

ToeB

BeitragSo, Aug 29, 2010 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm hört sich zwar gut an aber wofür genau ist das bzw. was ist ein "fake - fullscreen" ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xaymar

ehemals "Cgamer"

BeitragSo, Aug 29, 2010 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Fake-Fullscreen ist ein Fenster das den ganzen Haupt-Bildschirm bedeckt(wie bei Fullscreen), nur das es ein Fenster ohne Rand, Titelleiste und sonstigem ist. Dadurch ermöglicht man es den Usern ohne Texturverlust zu Alt-Tabben.
Warbseite

ZaP

BeitragSo, Aug 29, 2010 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man ein Spiel minimiert, kann der Speicher dreckig werden, dann kommt es zu MAVs. Ich glaube, wenn man alles in den Grafikspeicher lädt, geht es aber ohne Probleme. Vielleicht wars auch umgedreht.
Starfare: Worklog, Website (download)

aMul

Sieger des Minimalist Compo 01/13

BeitragMi, Sep 01, 2010 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine tolle Sache, danke für die Funktionen!
Benutze borderless windowmode bei allen Spielen die das anbieten, weil es viel einfacher ist, wenn man nebenbei chatten, oder das Spiel anderweitig eine Zeit im Hintergrund laufen lassen möchte.
Und auch das Abfangen der Schließen-Taste kann man immer mal gebrauchen.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 08, 2010 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe nun 3 neue Funktionen hinzugefügt und ein paar WinAPI Funktionen hinzugefügt. Sollten für die RTS ersteller nützlich sein. Wenn ihr die DLL dazu nicht benutzen wollt, sucht nach ClipCursor in der MSDN suchen.
Warbseite

ToeB

BeitragMi, Dez 08, 2010 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber mal ne Frage ... Wird das dann nicht langsamer ? Ich mein wenn ich Flip benutze wird ja auch das Fenster von Windows geupdatet (Wenn ich das richtig verstanden habe) und das ist langsamer ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 08, 2010 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Wovon redest du und warum verstehe ich kein wort?
Warbseite

ToeB

BeitragMi, Dez 08, 2010 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Rolling Eyes

Also nochmal für die etwas langsameren : Es bezog sich auf deine Angebotene DLL (worauf auch sonst), und darauf das diese DLL ein Fenster in Bildschirmgröße ohne Rand etc. erzeugt zur Verbeugung von Verlusten der im Grafikspeicher vorhandenen Texturen. Meine Frage ist, da wenn man ein Fenster startet (kein Vollbild) ja Windows teilweise das Updaten von diesem übernimmt, und das macht es langsam. Deshalb : Hat man durch diese DLL den selben Effekt oder kann man es wie ein "echten" Fullscreen handhaben nur halt ohne den Verlust ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 08, 2010 23:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Windows übernimmt nur das zeichnen des FensterBuffers. Alles andere macht Blitz's Window Callback. Ich habe bis jetzt keinen Geschwindigkeitsverlust bemerkt, eher eine steigerung bei manchen dingen, da VSync ja nun vom WindowCallback gemacht wird.
Warbseite

ZaP

BeitragSa, Dez 11, 2010 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe diese äußerst schöne Userlib in Starfare verwendet, weil es viele Beschwerden gab, dass man das Spiel nicht richtig minimieren kann.
Einziger Mängel ist, dass beim Windowstretching die Kantenglättung verloren geht, was im Gegensatz zum echten Vollbildmodus etwas unschön aussieht. Hast Du dafür zufällig einen Fix parat? Wenn nicht, ist es auch nicht so wild, die meisten werden wohl ohnehin in Desktopauflösung spielen. Smile
Starfare: Worklog, Website (download)

Xaymar

ehemals "Cgamer"

BeitragSo, Dez 12, 2010 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme an du meinst die Kantenglättung vom Text. Da kann ich denke ich mal nicht viel dran verändern, das ist Blitzintern.
Kannst du mir mal 2 Screenshots zeigen die das verdeutlichen? (PNG am besten)
Eventuell kann ich einen DX7 Hook erstellen der das behebt.
Warbseite

ZaP

BeitragSo, Dez 12, 2010 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich habe mich ungenau ausgedrückt. Vielleicht als Beispiel: Du hast ein Bild, und skalierst es, einmal mit Filter und einmal ohne/mit schlechterem, das verdeutlicht am besten, was ich meine.
Zwei Screenshots kann ich leider nicht posten, denn ich habe ja keine Chance, das von meinem Monitor vergrößerte Bild in einem Screenshot einzufangen. Mein Monitor ist 1280x1024, wenn ich das Spiel auf 1024x768 im echten Vollbild laufen lasse, und einen Screenshot mache, dann ist der ebenfalls so groß. Hier also mal 800 x 600 nach 1280 x 1024 skaliert.
Starfare: Worklog, Website (download)

Xaymar

ehemals "Cgamer"

BeitragMo, Dez 13, 2010 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest natürlich das Fake-Fullscreen nicht in der falschen Auflösung nehmen. Dazu hatte ich ja die Funktion mitgeliefert.
Es gibt ein paar Probleme mit Windows 7(Windows 7 kann die Monitore je nach Startzeit der Monitore verwechseln, wodurch GetMainMonitor(Interner Callback) auf einmal andere Werte liefert), aber dagegen kann ich recht wenig unternehmen.
Ich hatte bisher noch keine Probleme mit der Funktion, wie man bei den CW Screenshots ja auch sieht.
Warbseite

Xaymar

ehemals "Cgamer"

BeitragFr, Okt 19, 2012 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Da Ich aus versehen die DLL aus dem Archiv löschte habe Ich die Funktionen der DLL nachgebaut:

Utility_LockPointerToWindow( hwnd=0 ) (BB)
Was: Sperrt den Cursor('Maus') in den Bereich eines Fensters. Muss vor Programmende wieder aufgehoben werden(hwnd=0).
BlitzBasic: [AUSKLAPPEN]
;----------------------------------------------------------------
;-- Userlib
;----------------------------------------------------------------
;.lib "User32.dll"
;User32_ClientToScreen%(hwnd%, point*):"ClientToScreen"
;User32_ClipCursor%(rect*):"ClipCursor"
;User32_GetSystemMetrics%(index%):"GetSystemMetrics"
;----------------------------------------------------------------

;----------------------------------------------------------------
;-- Types
;----------------------------------------------------------------
Type Rectangle
Field X,Y,X2,Y2
End Type

Type Point
Field X,Y
End Type
;----------------------------------------------------------------

;----------------------------------------------------------------
;-- Global
;----------------------------------------------------------------
Global Utility_Rect.Rectangle = New Rectangle
Global Utility_Point.Point = New Point
;----------------------------------------------------------------

;----------------------------------------------------------------
;-- Functions
;----------------------------------------------------------------
Function Utility_LockPointerToWindow(hwnd=0)
If hwnd = 0 Then
Utility_Rect\X = 0
Utility_Rect\Y = 0
Utility_Rect\X2 = User32_GetSystemMetrics(78)
Utility_Rect\Y2 = User32_GetSystemMetrics(79)
User32_ClipCursor(Utility_Rect)
Else
;Grab TopLeft
Utility_Point\X = 0
Utility_Point\Y = 0
User32_ClientToScreen(hwnd, Utility_Point)
Utility_Rect\X = Utility_Point\X
Utility_Rect\Y = Utility_Point\Y

;Grab BottomRight
Utility_Point\X = GraphicsWidth()
Utility_Point\Y = GraphicsHeight()
User32_ClientToScreen(hwnd, Utility_Point)
Utility_Rect\X2 = Utility_Point\X
Utility_Rect\Y2 = Utility_Point\Y

User32_ClipCursor(Utility_Rect)
EndIf
End Function
;----------------------------------------------------------------


Utility_EnumerateDisplays() (C++/DLL)
Utility_GetDisplayCount() (C++/DLL)
Utility_GetDisplay( id%, rectangle* ) (C++/DLL)
Was: Benutzen sofern man Informationen über Bildschirme braucht. Nützlich für 'Borderless Window'.
BlitzBasic: [AUSKLAPPEN]
;----------------------------------------------------------------
;-- Userlib
;----------------------------------------------------------------
;.lib "Utility_Displays.dll"
;Utility_EnumerateDisplays():"Utility_EnumerateDisplays"
;Utility_GetDisplayCount%():"Utility_GetDisplayCount"
;Utility_GetDisplay(id%, rectangle*):"Utility_GetDisplay"
;----------------------------------------------------------------

;----------------------------------------------------------------
;-- C++ DLL
;----------------------------------------------------------------
; #Include <windows.h>
;
; struct Display {
; int left;
; int top;
; int right;
; int bottom;
; Display* nextDisplay;
; Display* prevDisplay;
; };
; Display* firstDisplay = NULL;
; Display* lastDisplay = NULL;
;
; BOOL CALLBACK _EnumerateDisplaysProcedure(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData);
; STDAPIV_(void) Utility_EnumerateDisplays() {
; /* Clean up the Linked List first. */
; if (firstDisplay) {
; Display* displayPointer = firstDisplay;
; while(displayPointer) {
; Display* thisDisplay = displayPointer;
; displayPointer = displayPointer->nextDisplay;
; delete thisDisplay;
; }
; firstDisplay = NULL;
; lastDisplay = NULL;
; }
;
; EnumDisplayMonitors(NULL, NULL, _EnumerateDisplaysProcedure, 0);
; }
;
; BOOL CALLBACK _EnumerateDisplaysProcedure(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {
; Display* thisDisplay = new Display;
; ZeroMemory(thisDisplay,sizeof(thisDisplay));
;
; if (!firstDisplay) firstDisplay = thisDisplay;
; if (!lastDisplay) {
; lastDisplay = thisDisplay;
; } else {
; lastDisplay->nextDisplay = thisDisplay;
; thisDisplay->prevDisplay = lastDisplay;
; }
; thisDisplay->left = lprcMonitor->left;
; thisDisplay->top = lprcMonitor->top;
; thisDisplay->right = lprcMonitor->right;
; thisDisplay->bottom = lprcMonitor->bottom;
; lastDisplay = thisDisplay;
;
; return TRUE;
; }
;
; STDAPIV_(int) Utility_GetDisplayCount() {
; int displayCount = 0;
; Display* displayPointer = firstDisplay;
; while (displayPointer) {
; displayCount++;
; displayPointer = displayPointer->nextDisplay;
; }
; return displayCount;
; }
;
; STDAPIV_(void) Utility_GetDisplay(int displayId, LPRECT display) {
; int displayCount = 0;
; Display* displayPointer = firstDisplay;
; while (displayPointer) {
; if ((displayCount == displayId) && (display) && (displayPointer)) {
; display->left = displayPointer->left;
; display->top = displayPointer->top;
; display->right = displayPointer->right;
; display->bottom = displayPointer->bottom;
; }
; displayCount++;
; displayPointer = displayPointer->nextDisplay;
; }
; }
;
; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {return TRUE;}
;----------------------------------------------------------------
; Linker Options: -static-libgcc -static-libstdc++
; Linker Libraries: user32
;----------------------------------------------------------------

;----------------------------------------------------------------
;-- Types
;----------------------------------------------------------------
Type Rectangle
Field X,Y
Field X2,Y2
End Type
;----------------------------------------------------------------


Utility_InstallCloseHandler( hwnd ) (C++/DLL)
Utility_UninstallCloseHandler( hwnd ) (C++/DLL)
Utility_GetCloseCount%( hwnd ) (C++/DLL)
Was: Benutzen um den schließen Button abzufangen.
BlitzBasic: [AUSKLAPPEN]
;----------------------------------------------------------------
;-- Userlib
;----------------------------------------------------------------
;.lib "User32.dll"
;User32_SetWindowLong%(hwnd%, nIndex%, dwNewLong%):"SetWindowLongA"
;User32_GetWindowLong%(hwnd%, index%):"GetWindowLongA"
;
;.lib "Utility_CloseHandler.dll"
;Utility_InstallCloseHandler(hwnd%):"Utility_InstallCloseHandler"
;Utility_UninstallCloseHandler(hwnd%):"Utility_UninstallCloseHandler"
;Utility_GetCloseCount%(hwnd%):"Utility_GetCloseCount"
;----------------------------------------------------------------

;----------------------------------------------------------------
;-- C++ DLL
;----------------------------------------------------------------
; #Include <windows.h>
;
; LRESULT CALLBACK _CloseWindowProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
;
; struct WindowUserData {
; Int oldWindowProcedure;
; Int oldUserData;
; Int closeCount;
; };
;
; STDAPIV_(void) Utility_InstallCloseHandler(HWND hwnd) {
; If (hwnd) {
; WindowUserData* hwndData = New WindowUserData;
; ZeroMemory(hwndData, sizeof(hwndData));
; hwndData->oldWindowProcedure = SetWindowLong(hwnd, GWL_WNDPROC, (LONG)&_CloseWindowProcedure);
; hwndData->oldUserData = SetWindowLong(hwnd, GWL_USERDATA, (LONG)hwndData);
; }
; }
;
; STDAPIV_(void) Utility_UninstallCloseHandler(HWND hwnd) {
; If (hwnd) {
; WindowUserData* hwndData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
; If (hwndData) {
; SetWindowLong(hwnd, GWL_USERDATA, hwndData->oldUserData);
; SetWindowLong(hwnd, GWL_WNDPROC, hwndData->oldWindowProcedure);
; Delete hwndData;
; }
; }
; }
;
; STDAPIV_(Int) Utility_GetCloseCount(HWND hwnd) {
; If (hwnd) {
; WindowUserData* hwndData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
; If (hwndData) {
; Int toReturn = hwndData->closeCount;
; hwndData->closeCount = 0;
; Return toReturn;
; }
; }
; Return 0;
; }
;
; LRESULT CALLBACK _CloseWindowProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
; WindowUserData* hwndData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
; If (hwndData) {
; switch(uMsg) {
; Case WM_CLOSE:
; Case WM_DESTROY:
; hwndData->closeCount++;
; Return False;
; Default:
; Return CallWindowProc((WNDPROC)hwndData->oldWindowProcedure, hwnd, uMsg, wParam, lParam);
; }
; } Else {
; Return DefWindowProc(hwnd, uMsg, wParam, lParam);
; }
; }
;
; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {return TRUE;}
;----------------------------------------------------------------
; Linker Options: -static-libgcc -static-libstdc++
; Linker Libraries: user32
;----------------------------------------------------------------

SetBuffer BackBuffer()

Utility_InstallCloseHandler(SystemProperty("AppHWND"))

Local c
While Not KeyHit(1)
c = c + Utility_GetCloseCount(SystemProperty("AppHWND"))
Cls

Text MouseX(),MouseY(),c
Flip
Wend
Utility_UninstallCloseHandler(SystemProperty("AppHWND"))
Delay 10
End


Der einfachheit halber habe ich auch die komplette DLL kompiliert, hier könnt Ihr sie euch downloaden.
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group