Как проверить, открыто ли окно и отображается ли оно на экране, например, нет ли задержки?
Я хочу убедиться, что окно открыто и отображается на экране (с поддержкой более чем одного монитора, конечно), потому что я приказываю Windows подделать щелчок мыши на форме, чтобы Google Translate textbox в браузере был выбран (я много пробовал выбрать его, но он не работает, так как не всегда он выбирается), поэтому я не хочу, чтобы щелчок мыши нажимал на что-то другое, я сделал квадрат цветов 3x3, и я хочу проверить на экране, действительно ли эти 9 цветов находятся на экране, а затем быстро заказать поддельный щелчок мыши, я не получаю правильные цвета, когда я тестирую с этим кодом:
Что я уже пробовал:
private void FormMain_Paint(object sender, PaintEventArgs e) { ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50, 1, Color.Gray); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50 + 1,1, Color.DarkGray); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50 + 2, 1, Color.Brown); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50, 2, Color.RosyBrown); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50 + 1, 2, Color.DarkSlateGray); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50 + 2, 2, Color.DarkGray); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50, 3, Color.SlateGray); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50 + 1, 3, Color.LightSlateGray); ClassSetGetPixel.SetPixel(this, pictureBoxSettings.Right + 50 + 2, 3, Color.LightGray); }
if (formMain.WindowState != FormWindowState.Minimized) { if ((GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50, 1))) == Color.Gray) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50 + 1, 1))) == Color.DarkGray) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50 + 2, 1))) == Color.Brown) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50, 2))) == Color.RosyBrown) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50 + 1,2))) == Color.DarkSlateGray) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50 + 2, 2))) == Color.DarkGray) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50, 3))) == Color.SlateGray) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50 + 1, 3))) == Color.LightSlateGray) && (GetPixel(formMain.PointToScreen(new Point(formMain.pictureBoxSettings.Right + 50 + 2, 3))) == Color.LightGray)) { Program.DoMouseClick(formMain.Location.X + formMain.pictureBoxSettings.Right + 1, formMain.Location.Y + formMain.pictureBoxSettings.Top + 100); } }
static public void SetPixel(Control control, int x, int y, Color color) { if (control != null) { IntPtr hDC = GetDC(control.Handle); int argb = color.ToArgb(); int colorRef = (int)((argb & 0x00FF0000) >> 16) | (int)(argb & 0x0000FF00) | (int)((argb & 0x000000FF) << 16); SetPixel(hDC, x, y, colorRef); ReleaseDC(control.Handle, hDC); } }
static Color GetPixel(Point p) { using (var bitmap = new Bitmap(1, 1)) { using (var graphics = Graphics.FromImage(bitmap)) { graphics.CopyFromScreen(p, new Point(0, 0), new Size(1, 1)); } return bitmap.GetPixel(0, 0); } }
Richard MacCutchan
Какие цвета вы получаете? Вы уверены, что ваши пиксельные адреса верны?
john1990_1
Я сделал цвет c=GetColor(); первого адреса, и он вернул случайный и неназванный цвет (так как "именованный цвет" был ложным), однако когда я делаю щелчок мыши на первом местоположении, он правильно нажимает на местоположение нарисованных пикселей... может быть, это из-за размытия панели формы (окна), и мне следует немного уменьшить пиксели, чтобы убежать от размытия.
john1990_1
Поместить пиксели в положение Y=20,21,22 не получилось.
Richard MacCutchan
Одна из проблем с этим может заключаться в том, что Windows управляет физическим экраном, и часто цвета будут объединены, так что то, что вы рисуете в форме, фактически изменяется, когда оно отображается на экране.
john1990_1
Мне нужно быть уверенным, поэтому я сдаюсь, если это правда, как мы можем точно знать, является ли это проблемой?
Richard MacCutchan
Вам нужно использовать отладчик, чтобы точно проверить, какие пиксельные адреса возвращаются из PointToScreen
назовите, и какие значения цвета в каждой точке.
john1990_1
Когда я вызываю движение мыши к местоположению PointToScreen, оно идет к середине моего квадрата 3x3. Хотите увидеть полный исходный код vs? как я могу поделиться этим?
Richard MacCutchan
Извините, но я не хочу видеть полный исходный код, так как у меня нет времени изучать весь ваш код.
john1990_1
Никаких проблем, никаких догадок, почему это не работает?
Richard MacCutchan
По моему опыту, догадки никогда не срабатывают. Единственный способ узнать это-использовать отладчик, чтобы увидеть, что происходит внутри кода.
john1990_1
Я думаю, что проблема заключается в том, что у меня есть 4 экрана, как сказать GetPixel искать точку в координатах 4 экранов. (например, 3 на столе и один выше)
Richard MacCutchan
Видеть windows - WinApi - получить индекс монитора, на котором выполняется процесс - переполнение стека[^]
john1990_1
Что делать, если windows находится на 2 или более мониторах одновременно?
Richard MacCutchan
Затем вам придется попробовать несколько вещей и проверить документацию MSDN.
john1990_1
Я добавил свой метод "GetPixel", проверьте его PLZ.
Richard MacCutchan
Извините, но я не совсем понимаю, о чем вы спрашиваете. Как я уже говорил ранее, вам нужно потратить время с отладчиком, чтобы точно проверить, что происходит в вашем коде. Это не то, что кто-то другой может сделать для вас.
john1990_1
Я долго отлаживал и зашел в тупик, а что, если речь идет о масштабировании экранов Windows?
john1990_1
Речь идет о том, что масштабирование экранов рабочего стола Windows составляет 150%, это сработало, когда я сделал масштабирование 100%, как это исправить (заставить программу учитывать масштабирование)?
Richard MacCutchan
Вы, вероятно, достигли точки, когда ваши исходные цвета были "отрегулированы" Windows для отображения увеличенных изображений. Но я понятия не имею, что вы можете сделать в таком случае. Вероятно, вам придется переосмыслить то, чего вы пытаетесь достичь.
john1990_1
Цвета точно такие же, просто я не могу добраться до их истинного местоположения, так как один способ дает мне местоположение при 100% - ном увеличении и один при 150% - ном увеличении, я проверил его и увидел, что он получает изображение не в нужном месте, но когда я сделал масштабирование на 100% на всех экранах, я получил истинное изображение формы (когда я отправил координаты формы и размер в новом размере(200,200)).
john1990_1
Я хочу установить фокус ввода на исходном текстовом поле в элементе управления веб-браузером в форме, когда форма открывается или нажимается F1, я пытался очень долго, но ни один способ не работал безупречно, кроме вызова щелчка мыши на пустом пикселе в форме.
Richard MacCutchan
Это не то, что я сделал, но могут быть классы .NET, которые могут найти элементы управления в другой форме.