Usando o SetWindowPos com vários monitores
Usinguser32.dll
e C # escrevi o método que você vê abaixo. Usando uma alça de processo para uma janela, ela definirá a posição da janela em{x,y}
localização.
No entanto, em um ambiente com vários monitores, o código abaixo define apenas a posição da janela para o monitor principal. Gostaria de poder selecionar também qual monitor.
Pode alguém explicar como isso pode ser feito usandoSetWindowPos
ou talvez uma combinação com outrouser32.dll
função?
[DllImport("user32.dll", SetLastError = true)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_SHOWWINDOW = 0x0040;
public static void SetWindowPosition(Process p, int x, int y)
{
IntPtr handle = p.MainWindowHandle;
if (handle != IntPtr.Zero)
{
SetWindowPos(handle, IntPtr.Zero, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
}
}
Solução baseada no comentário de Jim
qui está a configuração do meu monitor:
Observe que eu tenho um monitor secundário à esquerda do meu monitor principal. Depois de ler o link do Virtual Monitor fornecido por Jimi, descobri que, para mover as janelas para o monitor secundário, devo usar um valor x negativo porque ele fica à esquerda da origem do monitor primário (canto superior esquerdo ou <0,0>).
Portanto, se eu quiser que minha posição da janela seja definida como a coordenada <0,0> do monitor secundário, devo subtrair a largura x do monitor secundário a partir da origem do monitor primário, assim:
<0,0> - <1920,0> = <-1920,0>
Agora, quando eu chamo SetWindowPosition no código do meu cliente, eu chamo assim:
SetWindowPosition(Process p, -1920, 0);
Nota: Não sei o que você faria se os monitores tivessem resoluções diferentes. Esse é um tópico mais complexo e não uma pergunta que estou fazendo. Além disso, não vi a necessidade de explorar mais profundamente o tópico, pois o exemplo simples acima resolveu todos os meus problema