문제상황
게임화면 위에 원하는 미니맵을 띄우고 싶어서 개발을 시작함. VS써서 C#으로 Windows Forms app을 만들었으나 Forms.TopMost = true가 제대로 먹히지 않아 게임화면 밑으로 앱이 자꾸 묻힘. 인터넷 찾아보니 TopMost나 TopLevel에 parent 지정하는 것으로 z순서를 지정하라는데 내가 원하는 건 다른 앱 위에 올리는거라 결국엔 안됐음. 이전에 win32api 할 때 SetWindowEx로 임의의 창을 강제로 always on top으로 올리는 기능이 가능했기 때문에 c#에서도 분명히 될거라고 생각했음.
해결방법
결국은 user32.dll을 P/invoke로 import해서 해결 가능했다. 코드는 다음과 같다.
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace TW_Maps
{
partial class TopModal
{
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
/* Some codes */
private void InitializeComponent()
{
SuspendLayout();
/* Some codes */
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}
}
}
적용결과
아래와 같이 게임화면 위로 잘 올라왔다.
결과물
다음의 링크에 결과물 업로드해 두었다. MIT 라이센스로 배포하였다.
항상 위 기능 외에도 snap to screen edge라든가 draggable borderless window라든가 하는 잡기술들이 들어가 있다.
https://github.com/ProjectEli/TW_Maps/releases/latest
'프로그래밍' 카테고리의 다른 글
오디오 파일 읽어서 SoundCloud Waveform처럼 만들기 관련 자료 (0) | 2022.02.21 |
---|---|
manifest v3 Chrome extension에서 service worker와 indexedDB를 올바르게 사용하기 (0) | 2022.02.16 |
MATLAB으로 웹캠 OCR 하기 (2) | 2020.01.03 |
MATLAB으로 머신러닝 입문(?) (0) | 2019.12.13 |
GitLab 설정 (0) | 2018.04.07 |