java - How to run chrome using JNA? -


i wrote java code.

how run chrome using jna in windows(32bit).

then hwnd of it.

as know, findwindow simple solution if chrome doesn't running, doesn't work.

findwindow example

below code possible?

hwnd hwnd = user32.createprocess(...); 

below code open chrome. sizing, maxmizing doesn't work.


public interface kernel32 extends stdcalllibrary {     kernel32 instance = (kernel32) native.loadlibrary("kernel32", kernel32.class);      boolean createprocessa(              string lpapplicationname             , string lpcommandline             , structure lpprocessattributes             , structure lpthreadattributes             , boolean binherithandles             , int dwcreationflags             , structure lpenvironment             , string lpcurrentdirectory             , structure lpstartupinfo             , structure lpprocessinformation); } 

import com.sun.jna.pointer; import com.sun.jna.structure;  public class processinformation extends structure {     public pointer hprocess;     public pointer hthread;     public int dwprocessid;     public int dwthreadid; } 

import com.sun.jna.pointer; import com.sun.jna.structure; import com.sun.jna.wstring;  public class startupinfoa extends structure {     public int cb;     public wstring lpreserved;     public wstring lpdesktop;     public wstring lptitle;     public int dwx;     public int dwy;     public int dwxsize;     public int dwysize;     public int dwxcountchars;     public int dwycountchars;     public int dwfillattribute;     public int dwflags;     public short wshowwindow;     public short cbreserved2;     public pointer lpreserved2;     public pointer hstdinput;     public pointer hstdoutput;     public pointer hstderror; } 

public class test {     public static void main(string[] args) {          int startf_useposition = 0x00000004;         int startf_usesize = 0x00000002;         int startf_useshowwindow = 0x00000001;          processinformation processinformation = new processinformation();         startupinfoa startupinfo = new startupinfoa();         startupinfo.dwx = 100;         startupinfo.dwy = 100;         startupinfo.dwxsize = 100;         startupinfo.dwysize = 100;             startupinfo.wshowwindow = (short) sw_maximize;         startupinfo.dwflags = startf_useposition | startf_usesize;          kernel32.instance.createprocessa(new string("c:\\users.....\\google\\chrome\\application\\chrome.exe")                 , null                 , null                 , null                 , true                 , 0                 , null                 , null                 , startupinfo                 , processinformation);     } } 

if chrome not running, can't handle of window, of course, because such window not exist. might want run chrome, using processbuilder, call this:

user32.enumwindows( new wndenumproc() {      @suppresswarnings ( "assignmenttomethodparameter" )     public boolean callback ( int hwnd, int lparam )     {         if ( user32.iswindow( hwnd ) )         {             if ( user32.iswindowvisible( hwnd ) )             {                 rect r = new rect();                 user32.getwindowrect( hwnd, r );                 // if (r.left > -32000) // not minimized                 //{                 string windowtitle = getwindowparentname( hwnd );                 string windowclass = getwindowparentclassname( hwnd );                 hwnd = user32.getancestor( hwnd, 3 );                 if ( !windowtitle.tolowercase().equals( "program manager" ) && !windowclass.tolowercase().equals( "progman" ) && !windowtitle.equals( "" ) && !windowclass.tolowercase().equals( "shell_traywnd" ) )                 {                     listofwindows.put( hwnd, getwindowparentrectangle( hwnd ) );                 }                 // }             }             return true;         }         else         {             return false;         }     } }, 0 ); 

of course, working code has conditions specific app. main idea call enumwindows wndenumproc() put windows finds collection ( in case hashmap ). after enumwindows returns, have collection of windows in listofwindows variable , able hwnd of chrome if running during time enumwindows called.

you should define enumwindows in user32 instance this:

/**  * enumerates top-level windows on screen passing handle each window, in turn, application-defined callback function.  * @param wndenumproc pointer application-defined callback function.  * @param lparam application-defined value passed callback function.  * @return if function succeeded.  * <a href="http://msdn.microsoft.com/en-us/library/ms633497(v=vs.85).aspx"> <b>microsoft reference</b></a><br>  */ public boolean enumwindows ( wndenumproc wndenumproc, int lparam ); 

you should define wndenumproc structure in class (mine named structures) this:

  public static interface wndenumproc extends stdcalllibrary.stdcallcallback     {          boolean callback ( int hwnd, int lparam );     } 

hope helps. please note chrome must running while doing magic. running it, noted in beginning, should relatively straightforward using processbuilder or if don't want bother , chrome in path, can use

system.getruntime().exec("chrome.exe")

to start chrome.


Comments