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.
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
Post a Comment