2012-03-29 40 views
2

首先我不確定「.exe窗口」是否合適。這是啓動應用程序時彈出的窗口。更改調試時出現.exe窗口的位置?

我是一名遊戲程序員,當我正在調試時,我會很快啓動它,查看問題,然後再次關閉以對代碼進行微小更改,然後再次啓動它。這樣做每分鐘一次,所以它發生了很多。我的問題是.exe窗口總是出現在我的主屏幕(我正在編碼的位置)的中間,而且我正在運行雙顯示器,並且我希望遊戲窗口出現在我的第二個屏幕上,而不是我的主屏幕(模糊我的代碼)。

我可以在VS2010中更改exe窗口的位置嗎?我環顧四周,感覺就像。或者它是否必須由第三方程序管理?如果是這樣,什麼程序?

編輯: 好的,好的,我找到了解決方案。我做了一個非常愚蠢的錯誤,我沒有提到我使用XNA,而沒有使用winforms。抱歉誤導你們。下面是我如何解決它:

首先,我必須包括:

using System.Runtime.InteropServices; 
在我的主類的頂部

然後,我創建了一個小小的類:

public static class User32 
    { 
    [DllImport("user32.dll")] public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 
    } 

然後在我的初始化函數我只是打電話:

#if DEBUG 
       User32.MoveWindow(Game.Window.Handle, 2000, 400, 600, 480, true); 
    #endif 

這有點難看,但它只用於調試,只調用一次,所以psh。

原液在這裏找到:http://social.msdn.microsoft.com/forums/en-US/xnagamestudioexpress/thread/bc9588a9-542f-425b-9025-d69fe2b0b182/

+0

您可能希望將解決方案作爲答案並標記爲答案,以便您的問題不會出現未答覆。 – 2012-03-30 05:00:57

+0

是的。這是8小時過去了,所以我不能讓它成爲答案!愚蠢的規則,imo。雖然可能是一個很好的理由。 – Lemmi 2012-03-30 21:22:56

回答

1

雖然你沒有使用winforms,但你仍然使用winforms對象在Xna中改變它。我知道你找到了一個解決方案,但是這裏是如何改變它而不使用interop。

添加對System.Windows.Forms和System的引用。繪製到遊戲項目中的參考。

抵制添加使用這些語句的誘惑,因爲它可能會導致一些Xna對象(例如,Xna使用浮點數的Point)引起歧義。

在Game.Initialize方法:

System.Drawing.Point p = new System.Drawing.Point(2000, 400);// or wherever you want 
System.Windows.Forms.Control c = Control.FromHandle(this.Window.Handle); 
c.Location = p; 

遊戲窗口將開始在屏幕2000,400位置。

+0

這實際上比我的解決方案更好。謝謝! – Lemmi 2012-03-30 21:23:49

2

您可以設置Form.StartPosition屬性,或者只是手動寫信給你要移動的形式LeftTop性能。

+2

這當然會修改運行它的用戶的行爲。因此使用編譯器指令測試可能是有序的。這將允許它不會影響其他任何人在發佈模式,繼續工作**,但給你你想要的結果。 – 2012-03-29 17:05:57

+0

當然,但這些僅僅是細節。他問*如何覆蓋默認的表單定位,這就是你如何去做的。 *當*做這是一個不同的問題:) – Blindy 2012-03-29 17:06:49

+0

不使用winforms!忘了提及我正在使用xna。 – Lemmi 2012-03-29 22:22:27

2

選項1:如果連接了調試器,則可以在窗口/窗體上設置適當的屬性。

if (System.Diagnostics.Debugger.IsAttached) 
{ 
    // Set the window/form's top/left properties. 
} 

選項2:添加一個命令行開關,用它作爲起動參數(屬性 - >調試 - >命令行參數),然後設置在窗口/形式相應的屬性:

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    if (e.Args.Any(arg => arg.Equals("/debugmode", StringComparison.OrdinalIgnoreCase)) 
     // Set some value which you check in your main window. 
} 
+0

不使用winforms!忘了提及我正在使用xna。這是行不通的,因爲我的問題是我無法訪問我的主窗口位置。 – Lemmi 2012-03-29 22:22:58

1

我只是將其稱爲「主應用程序窗口」。總之,假設你使用的WinForms,這將使窗口在第一屏幕的左上角,是不是您的主屏幕:

void Form1_Load(object sender, EventArgs e) 
{ 
#if DEBUG 
    Location = Screen.AllScreens.First(s => !s.Primary).Bounds.Location; 
#endif 
} 

如果你只得到了兩個顯示器掛鉤,它會很好的工作。您也可以獲得更多創意,並將應用程序窗口置於另一臺顯示器上,最大限度地提高它的性能。如果您想要,可以用@Daniel建議的#if替換爲if (System.Diagnostics.Debugger.IsAttached)。我用前者只是提出另一種選擇。

+0

不,不使用WinForms。我應該提到這一點。 – Lemmi 2012-03-29 22:08:13

+0

我認爲這很奇怪,使用WinForms的遊戲開發,但你永遠不知道...:p – 2012-03-30 04:58:04

+0

@Nick,沒有那麼奇怪,有趣。在Xna之前,MDX(託管DirectX)是基於winforms的遊戲開發。 – 2012-03-30 14:35:27