PostMessage symulacja myszy

0

od dłuższego czasu próbuje znaleźć sposób na za symulowanie wciśnięcia przycisku myszy na oknie bez focusa, dla klawiatury wszystko działa pięknie.

kod który używam:

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", EntryPoint = "PostMessage", CallingConvention = CallingConvention.Winapi)]
        public static extern bool PostMessage(IntPtr hWnd, int msg, uint wParam, uint lParam);

        const int WM_LBUTTONDOWN = 0x201;
        const int WM_LBUTTONUP = 0x202;

        public void Click(int x, int y)
        {
            IntPtr hWnd = FindWindow(null, "Title");

            PostMessage(hWnd, WM_LBUTTONDOWN, 1, MakeDWORD(x, y));
            PostMessage(hWnd, WM_LBUTTONUP, 1, MakeDWORD(x, y));
        }

        private static int MakeLParam(int LoWord, int HiWord)
        {
            return HiWord * 65536 + LoWord;
        }

a podczas wywołania go nic się nie dzieje, tutaj log z spy++:

<00024> 000E0394 P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:111 yPos:111
<00025> 000E0394 P WM_LBUTTONUP fwKeys:MK_LBUTTON xPos:111 yPos:111

a tutaj log podczas zwykłego kliknięcia w okno (tylko mouse events):

<00007> 000E0394 S WM_MOUSEACTIVATE hwndTopLevel:000E0394 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00008> 000E0394 R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
<00009> 000E0394 S WM_SETCURSOR hwnd:000E0394 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
<00010> 000E0394 R WM_SETCURSOR fHaltProcessing:False
<00011> 000E0394 P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:512 yPos:518
<00012> 000E0394 S WM_SETCURSOR hwnd:000E0394 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00013> 000E0394 R WM_SETCURSOR fHaltProcessing:False
<00014> 000E0394 P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:512 yPos:518
<00015> 000E0394 S WM_SETCURSOR hwnd:000E0394 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONUP
<00016> 000E0394 R WM_SETCURSOR fHaltProcessing:False
<00017> 000E0394 P WM_LBUTTONUP fwKeys:0000 xPos:512 yPos:518

dodam że pracuje na win 7.

0

Niestety nie mam jak teraz sprawdzić czy działa ale proponuje użyć funkcji. Pisałem kiedyś aplikacje ala teamViewier, i wyciąłęm teraz kodu.

        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int X, int Y);
        [DllImport("User32.dll", SetLastError = true)]
        public static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize); 
                        INPUT i = new INPUT();
                        i.type = INPUT_MOUSE;
                        i.mi.dx = x;
                        i.mi.dy = y;
                        i.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
                        i.mi.dwExtraInfo = IntPtr.Zero;
                        i.mi.mouseData = 0;
                        i.mi.time = 0;
                        SendInput(1, ref i, Marshal.SizeOf(i));
                        i.mi.dwFlags = MOUSEEVENTF_LEFTUP;
                        SendInput(1, ref i, Marshal.SizeOf(i)); 
         public struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public int mouseData;
            public int dwFlags;
            public int time;
            public IntPtr dwExtraInfo;
        }
0

Być może w tym projekcie znajdziesz coś co Ci pomoże:
http://inputsimulator.codeplex.com/

Pozdrawiam

0

ta biblioteka jest oparta o te metody co podałem

0

sama symulacje myszy potrafię wykonać ale chciał bym ja wywołać bez zmiany focusa okna

1 użytkowników online, w tym zalogowanych: 0, gości: 1