B4J Question [SOLVED] Turn Off Display - programmatically / from C++ to Java, more specific javaobject

Magma

Expert
Licensed User
Longtime User
Hi there...

i need to turn off the display (monitor) of a pc programmatically...

Well the code in C++ is the following:
B4X:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    // Turn off monitor
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);

..tried to use jna...
but as always (just a hole in the water) - i am not much java guy...

as far... but nothing at all... :-(
B4X:
    Dim user32 As JavaObject
    user32 = user32.InitializeStatic("com.sun.jna.platform.win32.User32").GetField("INSTANCE")
    Dim ahwnd As JavaObject
    ahwnd=ahwnd.InitializeNewInstance("com.sun.jna.platform.win32.WinDef.HWND","0xffff")
    Dim awmsys As JavaObject
    awmsys=awmsys.InitializeNewInstance("com.sun.jna.platform.win32.WinDef.WPARAM","0xf170")
    Dim scmon As JavaObject
    scmon=scmon.InitializeNewInstance("com.sun.jna.platform.win32.WinDef.LPARAM","0x112S")
    user32.RunMethod("SendMessage",Array(ahwnd,scmon,awmsys,2))

Can anyone help on that conversion of code..?
 

Magma

Expert
Licensed User
Longtime User
About the C++ code, find a JNA based code that does what you want and I'll help you port it.
Java:
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.win32.StdCallLibrary;

public class TurnOffMonitor {
   public interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
      int SC_MONITORPOWER = 0xF170;
      int SC_MONITOR_OFF = 2;
      int SC_MONITOR_ON = -1;

      LRESULT SendMessageA(HWND paramHWND, int paramInt, WPARAM paramWPARAM,
            LPARAM paramLPARAM);

      LRESULT SendMessageA(HWND paramHWND, int paramInt, int paramInt2,
            LPARAM paramLPARAM);
   }

   private static final long SLEEP_TIME = 4 * 1000; // 4 seconds

   public static void main(String[] args) {
      final User32 user32 = User32.INSTANCE;
      System.out.println("Foo");

      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_OFF));

      try {
         Thread.sleep(SLEEP_TIME);
      } catch (InterruptedException e) {}

      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_ON));

   }
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
B4X:
#AdditionalJar: jna-5.0.0 
#AdditionalJar: jna-platform-5.0.0 
Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    Private xui As XUI 
    Private Button1 As B4XView
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1")
    MainForm.Show
    Dim jo As JavaObject
    jo.InitializeNewInstance("b4j.example.main$TurnOffMonitor", Null)
    jo.RunMethod("turnOff", Null)
    Sleep(3000)
    jo.RunMethod("turnOn", Null)
End Sub

Sub Button1_Click
    xui.MsgboxAsync("Hello World!", "B4X")
End Sub

#if JAVA
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.win32.StdCallLibrary;

public static class TurnOffMonitor {
   public interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
      int SC_MONITORPOWER = 0xF170;
      int SC_MONITOR_OFF = 2;
      int SC_MONITOR_ON = -1;

      LRESULT SendMessageA(HWND paramHWND, int paramInt, WPARAM paramWPARAM,
            LPARAM paramLPARAM);

      LRESULT SendMessageA(HWND paramHWND, int paramInt, int paramInt2,
            LPARAM paramLPARAM);
   }

   private static final long SLEEP_TIME = 4 * 1000; // 4 seconds
    
   public static void turnOff () {
      final User32 user32 = User32.INSTANCE;

      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_OFF));
   }
   
     public static void turnOn () {
      final User32 user32 = User32.INSTANCE;
      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_ON));
   }
   
   
  }
#End If
 
Upvote 0

Magma

Expert
Licensed User
Longtime User
...A silly question about Java and JavaObject...

well...

if i have javaobjects with the same using library at Java (#If JAVA) + why JavaObject not working properly... for example:

B4X:
...
    Dim user32 As JavaObject
    user32 = user32.InitializeStatic("com.sun.jna.platform.win32.User32").GetField("INSTANCE")
    Dim hwnd1 As JavaObject = user32.RunMethod("GetForegroundWindow",Null)
    Sleep(400)
    Dim Rect1 As JavaObject
    Rect1.InitializeNewInstance("com.sun.jna.platform.win32.WinDef.RECT",Null)
    Sleep(300)
    user32.runmethod("GetWindowRect",Array(hwnd1,Rect1))
    Sleep(300)

    LeftPixel=Rect1.GetField("left")
    TopPixel=Rect1.GetField("top")
    WidthPixel=(Rect1.GetField("right")-Rect1.GetField("left"))
    HeightPixel=(Rect1.GetField("bottom")-Rect1.GetField("top"))

    'if i log values getting "0" or -1 or 1 without IF JAVA working good... :-(
....
#if JAVA
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.Shell32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.win32.StdCallLibrary;

public static class TurnOffMonitor {
   public interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
      int SC_MONITORPOWER = 0xF170;
      int SC_MONITOR_OFF = 2;
      int SC_MONITOR_ON = -1;

      LRESULT SendMessageA(HWND paramHWND, int paramInt, WPARAM paramWPARAM,
            LPARAM paramLPARAM);

      LRESULT SendMessageA(HWND paramHWND, int paramInt, int paramInt2,
            LPARAM paramLPARAM);
   }

   private static final long SLEEP_TIME = 4 * 1000; // 4 seconds
   
   public static void turnOff () {
      final User32 user32 = User32.INSTANCE;

      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_OFF));
   }
  
     public static void turnOn () {
      final User32 user32 = User32.INSTANCE;
      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_ON));
   }
  
  
  }
 

#End If

my mistake those "{}}}}".. things :)
 
Last edited:
Upvote 0
Top