c # Программно переместить окно Citrix - PullRequest
0 голосов
/ 30 мая 2018

Использование следующего ответа Я пытаюсь программно изменить положение окна Citrix, оно почему-то не перемещается.

Я предполагаю, что имя процесса, содержащее окно Citrix, является одним изследующие процессы, которые были добавлены в Process.GetProcesses() после того, как я запустил Citrix: Receiver, wfica32, pnamain, концентр, wfcrun32.

любая помощь, почему окно не перемещается?

IntPtr hWnd = IntPtr.Zero;
var p1 = Process.GetProcesses().Where(p => p.Id != 0 && p.ProcessName == _processToRepositionWindowName).FirstOrDefault();
if (p1 != null && p1.MainWindowHandle != IntPtr.Zero)
{
     hWnd = p1.MainWindowHandle;
     //tried both options
     //hWnd = p1.Handle; 
}
else
{
      hWnd = FindWindow(_processToRepositionWindowName, null);
      if(hWnd == IntPtr.Zero)
      {
           hWnd = FindWindow(null, _processToRepositionWindowName);
      }
}

if (hWnd != IntPtr.Zero)
{
     var i = SetWindowPos(hWnd, IntPtr.Zero, windowXLocation, windowYLocation, 0, 0, SWP_NOSIZE | SWP_NOZORDER | 0x0040);
}

1 Ответ

0 голосов
/ 16 апреля 2019

У меня была одна и та же проблема пару раз (и не только с окнами Citrix ...).

Вам необходимо отправить сообщение EnterSizeMove перед вызовом SetWindowPos.В идеале вам необходимо закрыть сообщение ExitSizeMove (хотя я пропустил этот последний шаг пару раз).

Я пишу код на Java, но проблема одинакова на любом языке:

User32.instance.SendMessageA(hwnd, User32.WM_ENTERSIZEMOVE, 0, 0);
User32.instance.SetWindowPos(hwnd, hwndTopMost, x, y, 0, 0, flags);
User32.instance.SendMessageA(hwnd, User32.WM_EXITSIZEMOVE, 0, 0);

Я пришел к этому решению с форума AutoHotKey.

...