2009-09-18 6 views
3

게임에 대한 추가 기능을 만들고 있지만이 기능을 게임의 클라이언트 영역에 오버레이로 배치하려고합니다.C# 오버레이 폼을 다른 윈도우의 위치에 "잠급니다"

기본적으로 추가 기능을 시작하면 게임 상단에 표시되기를 원합니다. 잡기는 창을 최소화하거나 움직이면 양식을 붙잡고 싶습니다.

DirectDraw를 연결하지 않고도 트릭을 수행 할 수있는 사람은 누구나 알고 있습니까?

감사합니다.

+0

이 게임은 별도의 응용 프로그램입니까, 아니면 * 응용 프로그램이고 다른 "부동"양식을 추가하려고합니까? – MusiGenesis

+0

또한 별도의 응용 프로그램이라면 플러그인 API를 제공합니까, 아니면 완전히 게임 외부에서 작성하고 있습니까? –

+0

그것은 별도의 응용 프로그램이며 API가 없습니다. 나는 본질적으로 놀고있는 동안 다른 사람들과 잡담하기 위하여 IRC 수로에 연결하는 모양을 만들고있다. –

답변

5

다음은이 작업을 수행하는 간단한 방법입니다. 양식에이 선언을 추가,

using System.Runtime.InteropServices; 

다음 : 첫째, 당신은 양식의 using 문에이 줄을해야합니다

[StructLayout(LayoutKind.Sequential)] 
public struct RECT 
{ 
    public int X; 
    public int Y; 
    public int Width; 
    public int Height; 
} 

[DllImport("user32.dll", SetLastError = true)] 
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll", SetLastError = true)] 
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

다음으로, True로 양식의 맨 위의 속성을 설정합니다. 마지막으로, 폼에 타이머 컨트롤을 추가, 250의 간격 속성을 설정 true로 Enabled 속성, 그 틱 이벤트에서이 코드를 넣어 :

이 코드는 양식은 게임의 형태 위에 위치 유지됩니다
IntPtr hWnd = FindWindow(null, "Whatever is in the game's title bar"); 
RECT rect; 
GetWindowRect(hWnd, out rect); 
if (rect.X == -32000) 
{ 
    // the game is minimized 
    this.WindowState = FormWindowState.Minimized; 
} 
else 
{ 
    this.WindowState = FormWindowState.Normal; 
    this.Location = new Point(rect.X + 10, rect.Y + 10); 
} 

게임이 최소화되지 않은 경우 또는 게임이 최소화 된 경우에도 양식을 최소화합니다. 응용 프로그램의 상대 위치를 변경하려면 마지막 행에서 "+ 10"값을 변경하십시오.

더 복잡한 방법은 게임 양식이 최소화되거나 이동하거나 크기가 변하는시기를 결정하기 위해 Windows 메시지를 연결하는 것이지만이 폴링 방법은 거의 동일한 작업을 훨씬 간단하게 수행합니다.

마지막 비트가 하나입니다. : FindWindow는 해당 제목의 창을 찾지 못하면 0을 반환하므로 게임을 닫을 때 자신의 응용 프로그램을 닫을 수 있습니다.

관련 문제