根據(jù)窗口句柄,移動(dòng)/激活窗口
1.獲取窗口句柄
獲取窗口句柄上篇隨筆有寫,不再做贅述
2.引入U(xiǎn)ser32函數(shù)MoveWindow/ShowWindow
引入MoveWindow,用于移動(dòng)窗口,設(shè)置??SetLastError = true,若移動(dòng)窗口失敗,方便查找問(wèn)題
/// <summary> /// 設(shè)置目標(biāo)窗體大小,位置 /// </summary> /// <param name="hWnd">目標(biāo)句柄</param> /// <param name="x">目標(biāo)窗體新位置X軸坐標(biāo)</param> /// <param name="y">目標(biāo)窗體新位置Y軸坐標(biāo)</param> /// <param name="nWidth">目標(biāo)窗體新寬度</param> /// <param name="nHeight">目標(biāo)窗體新高度</param> /// <param name="BRePaint">是否刷新窗體</param> /// <returns></returns> [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);
引入ShowWindow,用于激活窗口
/// <summary> /// 顯示W(wǎng)indow /// </summary> /// <param name="hwnd">句柄</param> /// <param name="nCmdShow"> /// 0 隱藏窗口并激活另一個(gè)窗口。 /// 1 激活并顯示窗口。 如果窗口最小化或最大化,系統(tǒng)會(huì)將其還原到其原始大小和位置。 首次顯示窗口時(shí),應(yīng)用程序應(yīng)指定此標(biāo)志。 /// 2 激活窗口并將其顯示為最小化窗口。 /// 3 激活窗口并顯示最大化的窗口。 /// 4 在其最近的大小和位置顯示一個(gè)窗口。 此值類似于 SW_SHOWNORMAL,但窗口未激活。 /// 5 激活窗口并以當(dāng)前大小和位置顯示窗口。 /// 6 最小化指定的窗口,并按 Z 順序激活下一個(gè)頂級(jí)窗口。 /// 7 將窗口顯示為最小化窗口。 此值類似于 SW_SHOWMINIMIZED,但窗口未激活。 /// 8 以當(dāng)前大小和位置顯示窗口。 此值類似于 SW_SHOW,但窗口未激活。 /// 9 激活并顯示窗口。 如果窗口最小化或最大化,系統(tǒng)會(huì)將其還原到其原始大小和位置。 還原最小化窗口時(shí),應(yīng)用程序應(yīng)指定此標(biāo)志。 /// 10 根據(jù)啟動(dòng)應(yīng)用程序的程序傳遞給 CreateProcess 函數(shù)的 STARTUPINFO 結(jié)構(gòu)中指定的SW_值設(shè)置顯示狀態(tài)。 /// 11 即使擁有窗口的線程未響應(yīng),也會(huì)最小化窗口。 僅當(dāng)將窗口從不同的線程最小化時(shí),才應(yīng)使用此標(biāo)志。 /// </param> /// <returns></returns> [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
?
3.移動(dòng)并激活窗口的一些細(xì)節(jié)
?移動(dòng)并激活窗口后,可能會(huì)因?yàn)橐恍┰颍瑢?dǎo)致窗口移動(dòng)了,也激活了,但被疊在其他窗口下面。
預(yù)設(shè)兩種方案:
1).遍歷所有窗口,并用ShowWindow隱藏
2).模擬按下Win + M 最小化所有窗口,再激活需要調(diào)整的窗口
這里只對(duì)第二種方案做示例:
1).引入U(xiǎn)ser32函數(shù)keybd_event文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-463121.html
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern int ShowWindow(IntPtr hwnd, int nCmdShow); /// <summary> /// /// </summary> /// <param name="bVk">虛擬鍵值</param> /// <param name="bScan">0</param> /// <param name="dwFlags">按下0,釋放2</param> /// <param name="dwExtraInfo">0</param> [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "keybd_event")] public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
2).模擬按鍵文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-463121.html
keybd_event(0x5B, 0, 0, 0); keybd_event(77, 0, 0, 0); keybd_event(0x5B, 0, 0x02, 0); keybd_event(77, 0, 0x02, 0);
//0x5B == Win鍵
//77 == M鍵
4.示例:將兩個(gè)窗口在屏幕上并排顯示,實(shí)現(xiàn)分屏效果
var width = Screen.PrimaryScreen.WorkingArea.Width / 2; var height = Screen.PrimaryScreen.WorkingArea.Height; keybd_event(0x5B, 0, 0, 0); keybd_event(77, 0, 0, 0); keybd_event(0x5B, 0, 0x02, 0); keybd_event(77, 0, 0x02, 0); Task.Run(() => { Task.Delay(500).Wait(); ShowWindow(WindowsHandle1, 1); MoveWindow(WindowsHandle1, 0, 0, width, height, true); ShowWindow(WindowsHandle2, 1); MoveWindow(WindowsHandle2, width, 0, width, height, true); });
??5.獲取MoveWindow的LastError
//上方調(diào)用MoveWindow int i = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
- 系統(tǒng)錯(cuò)誤代碼 (0-499) (0x0-0x1f3)
- 系統(tǒng)錯(cuò)誤代碼 (500-999) (0x1f4-0x3e7)
- 系統(tǒng)錯(cuò)誤代碼 (1000-1299) (0x3e8-0x513)
- 系統(tǒng)錯(cuò)誤代碼 (1300-1699) (0x514-0x6a3)
- 系統(tǒng)錯(cuò)誤代碼 (1700-3999) (0x6a4-0xf9f)
- 系統(tǒng)錯(cuò)誤代碼 (4000-5999) (0xfa0-0x176f)
- 系統(tǒng)錯(cuò)誤代碼 (6000-8199) (0x1770-0x2007)
- 系統(tǒng)錯(cuò)誤代碼 (8200-8999) (0x2008-0x2327)
- 系統(tǒng)錯(cuò)誤代碼 (9000-11999) (0x2328-0x2edf)
- 系統(tǒng)錯(cuò)誤代碼 (12000-15999) (0x2ee0-0x3e7f)
到了這里,關(guān)于根據(jù)窗口句柄,移動(dòng)/激活窗口的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!