A downloadable extension

Download NowName your own price

This fancy extension addresses a quirk where GameMaker games cease to update while the window is being dragged around or resized.

The issue is Windows-specific behaviour - unless you run game logic and rendering on separate threads, system's dragging/resizing logic overtakes anything else and no other code executes until that's done.

The approach this extension takes is best called "a delightful hack" - the DLL starts up an simple helper program, into the window of which the game's window is then inserted as a child window.

This has the game window continue to run while the window is being manipulated, as well as allowing to enable/disable the window frame, allowing to also use it for borderless fullscreen.

The extension also includes it's own versions of Window Commands functions.

Documentation coming soon sometime? Till then, see the included object for examples and disable standard border in Global Game Settings - Windows - Graphics.

You can find sources on bitbucket.


Download NowName your own price

Click download now to get access to the following files:

window_frame.gmez 57 kB
window_frame.gmz 64 kB

Development log


Log in with itch.io to leave a comment.

Hey, love that you made this!

I'm struggling getting window resizing working together with borderless toggling. I can get one or the other working, but I'm not sure how to resize the frame after the window itself has been resized. window_frame_set_rect and window_frame_set_region don't seem to do it, at least not in the order I'm doing it

Also, when "borderless windowed" matches the full size of the screen (fake fullscreen), the taskbar sometimes covers the game. Is there any way around this too?

window_frame_set_rect should work. If you've got a minimal reproducible example, I'll take a look at weekend.

As for taskbar overlap, I've seen someone mention that but again, it's hard to tell what's up without reproduction steps, and even then it sounds like something on Windows' end so is a matter of whether someone is willing to sit down and try different hacks until something fixes it.

It took a bit of finagling, but I figured it out. Had to do window_frame_set_rect(middleX,middleY,w,h), then window_frame_set_region(0,0,w,h), then window_set_size(w,h), then window_set_position(0,0). 

As far as the taskbar overlap, it only shows up on game load, not when player was setting the resolution in game. I just set an alarm on my window manager object with a 20 frame delay that triggers my resolution change script. That puts it back over the taskbar.

Thanks again! Nice to have borderless "fullscreen" windowed be the default but be able to see the frame when it's at lower resolutions. :)

GameMaker Studio 2 support?

The extension reportedly works in GMS2, are you seeing anything particular?

Здравствуйте! Можно документацию, пожалуйста?


На данный момент документации не существует, лишь проект-пример (GMZ) и примечания к некоторым функциям в авто-завершении. Если есть возможность пожертвовать ~$20 через итч, документация по 26 функциям расширения может быть написана (пример) на русском или английском языке в ближайший выходной.

Спасибо за быстрый ответ! 

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


Для игры настраивается borderless режим в global game settings; спустя несколько вызовов window_frame_update расширение подвязывает к игре свое окно-рамку, благодаря которому фриз и устраняется

Большое спасибо! Очень помогло!

(1 edit)

Простите еще раз, что спрашиваю, но я стал замечать, что иногда, при переходе на полноэкранный режим, пользователь полностью теряет контроль до тех пор, пока он вручную не свернет игру и не переключится на нее снова. Это какой-то баг, или я что-то не сделал или сделал неправильно.


Не слышал о таком. Если можно маленький проект-пример, на котором проблема воспроизводится, я гляну на досуге

(1 edit)

Hi, I was curious if you had problems with Asynchronous System events while using window_frame. It doesn't seem to fire them anymore while being used. I disabled window_frame temporarily and the async events started firing again.

I need Asynchronous System events for gamepad support :]

Apparently the issue with both is that, since it is the frame window that is in focus rather than the game (though it is a child of it and takes input), it is not counted as active and will not take inputs. Not actually sure if there's an easy fix, but if you know anyone experienced with WinAPI and willing to help, you can have them look at the source code.

I checked the source code and I fixed the focus issue with ( to wndproc of the window_frame_host )

            HWND game = (HWND)GetWindowLongPtr( hWnd, GWLP_USERDATA );
            if ( game != nullptr ) {
                if ( IsWindow( game ) ) {
                    SetFocus( game );
            return 0;

This just checks for focus on the window and passes it to the game window. Seems to work for me.

Doesn't fix the gamepad issue though :[

Can you share an edited extension that has this fix? I have downloaded the source code and attempted to fix it myself, but I have no idea what I am doing and my attempts at learning aren't going so well.

Any chance it can be updated with 'window_frame_has_focus' function to check for focus, The 'window_has_focus' gamemaker has won't function properly with this.

TY anyway :)

1) Yes, I see an example from the Window Commands, but I think that this extensions minimizes the window in the Windows Taskbar, and not in the System Tray. Am I mistaken?

2) Let is the question yet. By default, window_set_fullscreen in GMS2 opens a window on the main monitor, or am i mistaken?

Ah, sorry. I didn't pay enough attention to your first message.

  1. It'd take an entirely different system to minimize to tray instead.
    If you are able to pay for that (rough estimate is $100..$150 depending on features), that could be implemented into this or a separate extension.
    (if you are wondering, this extension similarly exists only because someone sponsored the development and was fine with it being made publicly available)
  2. Conventional (DirectX) fullscreen rolls up on the monitor that it was initialized for, so usually the primary one.
    It's usually possible to move the game window between screens via Win+Shift+Left/Right, but I'm not sure if you could cheat it by pressing those keys via keyboard_key_press.
    If window_set_rect has any effect in fullscreen (or you are fine with borderless fullscreen), I could modify my other extension to return screen XYWH per monitor index.

I understand! =) I do not have free money for my non-commercial projects. Maybe later, maybe never, but definitely not now... In other words, I'm a beggar! =) I was just curious about your plans to change this extension. Thanks for answers.

Very nice idea of such an extension. Thank you! Little questions: 1) Is it planned to make to minimize window in system tray? 2) Is it planned to make to fullscreen mode on the monitor on which window is located? Thanks for answers.


1. See the example from Window Commands extension, this one has the same-styled functions.
2. Disabling border (see the example attached) would allow you to call window_set_fullscreen as usual.

Very often this blocks the steam overlay from launching with tab-shift. Otherwise works like a charm.

When using this together with Window Commands for GameMaker you get an error:
Maybe include the Freeze feature into Windows Commands?

Compile Extensions...Error : duplicate script name found window_command_hook in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_unhook in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_run in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_get_active in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_set_active in extension window_frame in file window_frame.gml

(1 edit)

As the description states, this extension includes it's own versions of all of Window Commands functions as they had to be reimplemented in a different way (the window being in an external process and all). You would remove Window Commands when switching to this extension.

ahh. Sorry. I should read more :-)

gr8 work again mah dood