2012-05-25 35 views
4

我試圖將模擬鼠標單擊發送到另一個應用程序。我知道如何實際發送按鍵點擊,這不是問題。我需要將鼠標點擊發送到其他應用程序的中心。我可以簡單地測試一次,找出座標並將點擊發送到該XY位置,但是存在一個問題...當我移動窗口或調整此窗口的大小時,XY座標顯然不會相同。將鼠標單擊發送到X另一個應用程序的Y座標

因此,我需要找出如何獲得窗口的大小及其位置,然後從中找出中心點。有人知道怎麼做嗎?非常感謝您的回覆!

這裏是我的代碼發送鼠標點擊

public void SendLeftClick(int x, int y) 
{ 
    int old_x, old_y; 
    old_x = Cursor.Position.X; 
    old_y = Cursor.Position.Y; 

    SetCursorPos(x, y); 
    mouse_event(MouseEventFlag.LeftDown, x, y, 0, UIntPtr.Zero); 
    mouse_event(MouseEventFlag.LeftUp, x, y, 0, UIntPtr.Zero); 
    SetCursorPos(old_x, old_y); 
} 
+0

請不要用「C#」等來標題。這就是標籤的用途。 –

+1

標題是誤導(特別是對谷歌),你的問題是如何找到窗口的位置和大小,而不是如何發送鼠標點擊某處。 –

回答

0

您可以使用GetWindowInfo API:

[return: MarshalAs(UnmanagedType.Bool)] 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi); 

    [StructLayout(LayoutKind.Sequential)] 
    struct WINDOWINFO 
    { 
     public uint cbSize; 
     public RECT rcWindow; 
     public RECT rcClient; 
     public uint dwStyle; 
     public uint dwExStyle; 
     public uint dwWindowStatus; 
     public uint cxWindowBorders; 
     public uint cyWindowBorders; 
     public ushort atomWindowType; 
     public ushort wCreatorVersion; 

     public WINDOWINFO(Boolean? filler) 
      : this() // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)". 
     { 
      cbSize = (UInt32)(Marshal.SizeOf(typeof(WINDOWINFO))); 
     } 

    } 
    [StructLayout(LayoutKind.Sequential)] 
    struct RECT 
    { 
     public int left, top, right, bottom; 
    } 


    private void button1_Click_1(object sender, EventArgs e) 
    { 
     var p = System.Diagnostics.Process.GetProcessesByName("mspaint"); 

     if (p.Length == 0) return; 

     WINDOWINFO wi = new WINDOWINFO(false); 
     GetWindowInfo(p[0].MainWindowHandle, ref wi); 

     SendLeftClick((wi.rcWindow.left + wi.rcWindow.right)/2, (wi.rcWindow.top + wi.rcWindow.bottom)/2); 
    } 
+0

似乎過於複雜,當GetWindowRect或GetClientRect可以。額外的複雜性會導致錯誤,就像您在調用之前沒有設置'cbSize'一樣。 –

+0

cbsize在windowinfo調用的構造函數中設置。如果他在計算時需要考慮窗口的邊界,這個調用也會有幫助,但是您的觀點是有效的。 –

+0

在你沒有使用的單參數構造函數中? –

0

設置光標位置,並在設定0,0 X和Y mouse_event例程:

SetCursorPos(x, y); 
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero); 
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero); 

現在正常工作。

相關問題