سؤال

أولاً ، أحاول إرسال إدخال لوحة المفاتيح إلى تطبيق خلفية (نافذة لا تركز أو قد لا تظهر حتى مرئيًا للمستخدم).

لقد تحقق من أن WinHandle والثوابت صحيحة. المشكلة هي أن تطبيق الخلفية لا يبدو أنه يحصل على الرسالة ، ما لم ، قمت بتعيين نقطة توقف على خط postmessage () ، واضغط على F10 (خطوة) أو F5 (متابعة) عندما يصل إلى هناك ، ثم يتم إرسال ضغط المفاتيح بطريقة سحرية .

ما يعطي؟ الكود ذي الصلة:

    [DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
    public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    PostMessage(winHandle, (uint)WM_KEYDOWN, 66, 0);

باستخدام Win7 64 و MS Visual Studio 2008 Pro ، تطبيق وحدة التحكم. والرمز أعلاه موجود على موضوع إذا كان ذلك يساعد.

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

المحلول

باستخدام Win7 64

هذا ذو صلة إلى حد ما ، الإعلان خطأ. يعمل في وضع 32 بت ، ولكنه مزعج في وضع 64 بت. الحيلتان الأخيرتان هما مؤشرات ، وليس ints. 8 بايت ، وليس 4. الإصلاح:

[DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

PostMessage(winHandle, (uint)WM_KEYDOWN, (IntPtr)66, IntPtr.Zero);

ومع ذلك ، قد لا يحل هذا في الواقع مشكلتك. في وضع X64 ، يتم تمرير الوسيطات الأربعة الأولى لأسلوب غير ثابت في السجلات ، وليس المكدس. يحدث فقط أن هذه الطريقة تحتوي على 4 وسيطات ، فلن تحصل على تحذير MDA Pinvokestackimalance. وغالبًا ما تكون 32 بتات من قيم التسجيل 64 بت من الصدفة صفرًا ، لذا لا يهم ما إذا كان P/Invoke Marshaller يولد قيمة وسيطة 32 بت أو 64 بت.

احذر أن هذا النهج مزعج للغاية في الممارسة العملية. لا يمكنك التحكم في حالة لوحة المفاتيح في العملية المستهدفة. أنت ترسل ضغط المفاتيح لـ B. التي قد تتحول إلى B أو B أو ALT+B أو CTRL+B ، اعتمادًا على حالة مفاتيح المعدل. فقط sendInput () يمكن أن تعمل بشكل موثوق. حسنًا ، قصير من مشكلة تركيز النافذة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top