سؤال

أنا أكتب استنساخ سطح المكتب البعيد في C++ باستخدام QT.حتى الآن أنا قادر على تحريك مؤشر الماوس بشكل جيد.لدى QT وظيفة setPos لطيفة لذلك.ومع ذلك، فأنا في حيرة من أمري فيما يتعلق بواجهة برمجة التطبيقات/المكتبة التي يجب استخدامها لمحاكاة نقرات زر الماوس.

إحدى الطرق التي أعرفها هي إرسال WM_(الحدث) إلى نافذة باستخدام HWND الخاص بالنافذة.ومع ذلك، كنت آمل أن تكون هناك طريقة أكثر وضوحًا للتحكم الكامل في الماوس.هل هناك أي طريقة أخرى لإخبار نظام التشغيل أنه تم النقر فوق زر الماوس الأيسر؟

شكرًا.

هل كانت مفيدة؟

المحلول

هذا موجود في لغة C#، ولكنه قد يساعدك في الحصول على فكرة:

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
   public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

   private const int MOUSEEVENTF_LEFTDOWN = 0x02;
   private const int MOUSEEVENTF_LEFTUP = 0x04;
   private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
   private const int MOUSEEVENTF_RIGHTUP = 0x10;

   public void DoMouseClick()
   {
      int X = Cursor.Position.X;
      int Y = Cursor.Position.Y;
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
   }

الموارد التي قد تساعد:

http://msdn.microsoft.com/en-us/library/ms646260%28VS.85%29.aspx

http://www.codeguru.com/Cpp/W-P/win32/article.php/c4543/

نصائح أخرى

والجمع بين كل togegher، هنا هو رمز للكيو تي:

#include <windows.h>
QApplication::desktop()->cursor().setPos(globalX,globalY);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);

لقد عملت حل لوكاس Šalkauskas "بالنسبة لي لبعض الوقت، ولكنها اليوم أدى فجأة في الخطأ التالي (وربما يرجع ذلك إلى بعض التحديث. NET بواسطة Windows Update؟)

<اقتباس فقرة>   

ودعوة إلى وظيفة PInvoke   "SampleMethod" لديه غير متوازن   كومة. وهذا هو المرجح لأن   تمكنت توقيع PInvoke لا   تطابق التوقيع الهدف غير المدارة.   تأكد من أن اصطلاح استدعاء و   المعلمات التوقيع PInvoke   تطابق التوقيع غير المدارة الهدف.

وهكذا انتقلت إلى pinvoke.net نموذج التعليمات البرمجية و يعمل كذلك الآن:

[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

[Flags]
public enum MouseEventFlags
{
    LEFTDOWN = 0x00000002,
    LEFTUP = 0x00000004,
    MIDDLEDOWN = 0x00000020,
    MIDDLEUP = 0x00000040,
    MOVE = 0x00000001,
    ABSOLUTE = 0x00008000,
    RIGHTDOWN = 0x00000008,
    RIGHTUP = 0x00000010
}

public static void LeftClick(int x, int y)
{
    Cursor.Position = new System.Drawing.Point(x, y);
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top