문제

Java의 UINT 매개 변수로 SendMessage를 호출하려고하지만 int를 UINT로 변환 할 수는 없습니다. Windows 함수이므로 SendMessage에서 UINT 매개 변수를 변경할 수 없습니다. 이것을하는 방법이 있습니까?

배경 : 실제로 처리를 사용하고 있으며 사용자 32.dll에 액세스하기 위해 다음 자습서를 따르고 있습니다. http://processing.org/hacks/hacks:jnative

그리고 http://jnative.free.fr/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는 내가 제공 한 장거리에 적용 할 수 없다고합니다. SendMessage도 수정할 수 없습니다

위의 호출이 호출하는 해당 Java 파일은 다음과 같습니다. GetActiveWindow 부분은 자습서에서 나오기 때문에 잘 작동합니다. 나는 그것을 따르기 위해 SendMessage를 맞춤화하려고 노력하고 있지만 아직 그것을 모두 알아 내지 않았습니다. 그러나 여기에서 매개 변수를 SendMessage로 변경하는 것은 컴파일러가 기대하는 것을 변경하지 않기 때문에 내가 얻는 오류에 중요하지 않다고 생각합니다. int 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);

귀하의 참조를 위해 다음은 org.xvolks.jnative.util.user32에서 SendMessage의 구현입니다. 보시다시피, 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를 좋아하지 않는다고 결정했다면, 당신은 Java Native Access (JNA).

다른 팁

데이터 관점에서 UINT와 int는 32 비트 값과 동일합니다. 유일한 차이점은 Opcode가 최상위 비트를 해석하는 방법입니다. Java와 C를 통과 할 때는 32 비트를 통과하므로 부호는 관련이 없습니다. 해결책은 UINT 매개 변수를 int로 선언하는 것입니다.

BTW, Unsigned/Signed의 문제는 SendMessage의 UMSG 값이 모든 Microsoft 메시지에 긍정적이기 때문에 중요하지 않으며, 그 문제에 대해서는 겪을 가능성이 높은 다른 것에 대해 긍정적일 가능성이 높기 때문입니다.

Java에는 서명되지 않은 유형의 개념이 없으므로 서명되지 않은 int를 나타 내기 위해서는 오랫동안 사용해야합니다. 확인하다 이 지역 이 작업을 수행하는 방법에 대한 예.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top