سؤال

وأنا أحاول أن استدعاء SendMessage مع معلمة UINT من جاوة، ولكن أنا لا يمكن تحويل الباحث إلى UINT. لا أستطيع تغيير المعلمة UINT في SendMessage لأنها هي وظيفة النوافذ. هل هناك طريقة للقيام بذلك؟

والخلفية: أنا فعلا باستخدام المعالجة، وأنا أتابع الدروس التالية لuser32.dll الوصول: HTTP: / /processing.org/hacks/hacks:jnative

http://jnative.free. الاب / SPIP-v1-8-3 / article.php3؟ id_article = 8

وأنا بعد هذا إلى استدعاء SendMessage http://www.codeproject.com/KB/cs/Monitor_management_guide.aspx

وهنا قانون بلدي، GetActiveWindow يعمل بشكل جيد، انها من الوصلة الثانية أعلاه.

 int SC_MONITORPOWER = 0xF170;
 int WM_SYSCOMMAND = 0x0112;
 int MONITOR_ON = -1;
 int MONITOR_OFF = 2;
 int MONITOR_STANDBY = 1;

HWND ValidHWND = org.xvolks.jnative.util.User32.GetActiveWindow(); 
org.xvolks.jnative.util.User32.SendMessage(ValidHWND, (UINT)WM_SYSCOMMAND, 
          (WPARAM)SC_MONITORPOWER, (LPARAM)MONITOR_STANDBY);

والسطر الأخير هو المكان الذي يحدث الخطأ، فإنه يقول UINT المتوقع في نوع USER32 لا ينطبق على فترة طويلة I المقدمة. لا أستطيع تعديل SendMessage إما

وهنا ملف جافا المقابل الدعوة فوق يتضرع، الجزء GetActiveWindow يعمل بشكل جيد لأنه من البرنامج التعليمي. أنا أحاول أن يخيط Sendmessage لمتابعته، لكني لم أحسب كل شيء بها حتى الآن. ومع ذلك، لا أعتقد أنه يهم الخطأ انني اتلقى، منذ تغيير المعلمات إلى SendMessage هنا لا يغير ما يتوقعه مترجم. لقد حاولت تغيير كثافة العمليات MSG إلى UINT MSG إلى MSG طويلة، والمترجم لا تزال تتوقع UINT من التعليمات البرمجية أعلاه.

public class Paul_s_User32 extends User32 {
public HANDLE GetActiveWindow() {
    JNative GetActiveWindow = new JNative(DLL_NAME, "GetActiveWindow");
    GetActiveWindow.setRetVal(Type.INT);
    GetActiveWindow.invoke();
    HWND handle = new HWND(GetActiveWindow.getRetValAsInt());
    GetActiveWindow.dispose();
    return handle;
}
public IntPtr SendMessage(IntPtr hWnd, int Msg, 
          IntPtr wParam, IntPtr lParam) {
    JNative SendMessage = new JNative(DLL_NAME, "SendMessage");
    //SendMessage.setRetVal(Type.long);
    SendMessage.invoke();

    SendMessage(ValidHWND, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_STANDBY);
}
هل كانت مفيدة؟

المحلول

إذا كنت تستخدم حزمة org.xvolks.jnative، كل من المعلمات (HWND، UINT، WPARAM، وLPARAM) هي فئات في org.xvolks.jnative.misc.basicStructures. لذلك يجب أن تكون قادرة على القيام بشيء من هذا القبيل (رمز مجربة):

import org.xvolks.jnative.misc.basicStructures.*;
...

User32.SendMessage(
    new HWND(ValidHWND),
    new UINT(WM_SYSCOMMAND), 
    new WPARAM(SC_MONITORPOWER),
    new LPARAM(MONITOR_STANDBY);

لرجوع اليها، وهنا تنفيذ SendMessage في org.xvolks.jnative.util.User32. كما ترون، رمز jnative لا يهتم على الإطلاق عن موقعة وغير موقعة. قد تجد أنه من المفيد للاستيلاء على jnative شفرة المصدر .

public static LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) throws NativeException, IllegalAccessException
{
    JNative SendMessage = new JNative(DLL_NAME, "SendMessageA");
    SendMessage.setRetVal(Type.INT);
    int pos = 0;
    SendMessage.setParameter(pos++, hWnd.getValue());
    SendMessage.setParameter(pos++, Msg.getValue());
    SendMessage.setParameter(pos++, wParam.getValue());
    SendMessage.setParameter(pos++, lParam.getValue());
    SendMessage.invoke();
    pos = SendMessage.getRetValAsInt();
    SendMessage.dispose();
    return new LRESULT(pos);
}

وإذا قررت أن كنت لا تحب JNative، هل يمكن أن نلقي نظرة على جافا الأصلية وصول ( JNA) .

نصائح أخرى

ومن منظور البيانات، UINT وكثافة العمليات هي نفس الشيء - قيمة 32 بت. والفرق الوحيد هو كيفية تفسير أكواد العمليات بت العلوي. عندما يمر بين Java و C، كنت مجرد مرور 32 بت، وبالتالي فإن علامة غير ذي صلة. الحل هو مجرد إعلان المعلمة UINT باعتبارها كثافة العمليات.

وراجع للشغل، مسألة غير موقعة / وقعت ليست كبيرة هنا لأن قيمة uMsg لSendMessage إيجابية لكافة الرسائل مايكروسوفت، ولهذه المسألة، هو أكثر من المحتمل إيجابية لأي شيء آخر أنت من المحتمل أن تواجهها.

ومنذ جافا ليس لديه فكرة من أنواع غير موقعة، لديك لاستخدام طويل لتمثيل صحيح غير الموقعة. تحقق هذا الموقع للحصول على أمثلة على كيفية القيام بذلك.

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