2010-05-09 22 views
1

我在Vista上有一個應用程序,它循環遍歷所有進程並查找關聯的主窗口以移動和調整它們的大小。MoveWindow API在Vista上無法正常工作

問題是,有些窗口被移動和調整大小,有些則沒有。此外它甚至似乎移動和調整大小的窗口不會根據MoveWindow函數調用進行移動和調整大小,因爲它們被調整爲標題欄,並且它們都位於同一行(相同的y座標)。

這裏的示例代碼:

IntPtr handle; 
Process[] processList = Process.GetProcesses(); 

int i = 0; 
foreach (Process process in processList) 
{ 
    handle = process.MainWindowHandle; 

    if (handle != IntPtr.Zero) //If the process has window then move and resize it. 
    { 
      bool moveResult = MoveWindow(handle, i * 50, i * 50, 500, 500, true); 
      i++; 
    } 
} 

這是因爲Vista嗎?我應該使用什麼替代方法?

+0

怎麼了與多個窗口的進程?首先檢查窗口是否可見,是否有意義? – 2010-05-09 21:19:34

+0

讓我們保持簡單:進程只有一個窗口,所有窗口都可見,但即使如此,一些窗口根本不會移動,其他窗口最小化爲標題欄而不是500x500像素。 – 2010-05-09 22:02:20

+0

那麼你不是在一個真正的Windows系統上運行它呢?只是一個假設,所有的進程只有一個窗口(這從來不會發生) – Stewart 2010-05-10 00:06:31

回答

1

似乎MoveWindow函數對最小化窗口沒有任何影響。因此,在MoveWindow之前,我使用了ShowWindow:

ShowWindow(handle,3); // ShowMaximized = 3

這有幫助!

我使用了SetWindowPos函數,但關於此函數的MSDN文檔說,在Vista中「hwnd和窗口管理器操作只在會話中有效,並且跨會話嘗試操作hwnd將失敗」,並且該聲明指出問題是因爲的Vista。

http://msdn.microsoft.com/en-us/library/ms633545%28v=VS.85%29.aspx