2013-03-23 2 views
0

У меня есть следующий Visual Basic 2010 код:ввода в неактивное окно

Function GetScreenPixel(ByVal Location As Point) As Color 
    Dim C As Color 
    Using Bmp As New Bitmap(1, 1) 
     Using G As Graphics = Graphics.FromImage(Bmp) 
      G.CopyFromScreen(Location, Point.Empty, Bmp.Size) 
      C = Bmp.GetPixel(0, 0) 
     End Using 
    End Using 
    Return C 
End Function 

Чтобы получить цвет пикселя на экране.

Затем я использую что-то вроде:

Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer) 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    If GetScreenPixel(New Point(650, 728)).ToString = "Color [A=255, R=255, G=255, B=255]" Then 
     Cursor.Position = New Point(955, 548) 
     mouse_event(&H2, 0, 0, 0, 0) 
     mouse_event(&H4, 0, 0, 0, 0) 
    End If 
End Sub 

Чтобы получить, отображается ли определенная кнопка на экране и активной (если это правда, то пиксел 650, 728 будет белым), и если да, то это будет щелкните его.

Это прекрасно работает. Мой вопрос заключается в том, что если я смогу каким-то образом расширить код, чтобы как функция для получения цвета пикселя, так и код для щелчка мыши можно было применить к неактивному окну. Чтобы я мог оставить свое приложение и щелкнуть по кнопке всякий раз, когда это необходимо, и я также могу использовать свой компьютер для других вещей одновременно.

Я слышал о чем-то под названием:

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr 

Однако у меня было много трудностей заставить его работать с кодом образца я показал выше - и она до сих пор не обеспечивает решение получение цвета пикселя в неактивном окне.

Спасибо.

+0

У кого-нибудь нет решения? Или даже намек на то, как решить проблему? – CHRIS

ответ

0

Чтобы активировать другое окно необходимо иметь сон между мышью вниз & UP, чтобы имитировать реальный CLICK

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, 
    (uint)Convert.ToInt32(position.X * (65535.0/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width)), 
    (uint)Convert.ToInt32(position.Y * (65535.0/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)), 0, 0); 

Thread.Sleep(400); 

mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, 
    (uint)Convert.ToInt32(position.X * (65535.0/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width)), 
    (uint)Convert.ToInt32(position.Y * (65535.0/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)), 0, 0); 

Кроме того, вы можете быть заинтересованы в функции перемещения мыши - позиции должны быть установлены с флагом MOUSEEVENTF_ABSOLUTE в диапазоне 0 - 65535

mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, 
        (uint)Convert.ToInt32(position.X * (65535.0/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width)), 
        (uint)Convert.ToInt32(position.Y * (65535.0/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)), 0, 0); 
+0

Мое намерение состояло в том, чтобы не активировать другое окно, хотя щелчки мыши; Я уже смог это сделать. То, что я хотел, - это способ отправки виртуального ввода в окно, которое не является активным (не активируя его и не нарушая все, что я делаю). – CHRIS

Смежные вопросы