TITLE:JNIでJFrameのHWNDを取得
Posted by aterai at 2008-09-04*1

JNIでJFrameのHWNDを取得

#adsense2

概要

JNI Windowsでウィンドウハンドルを取得する - Memo of Masterの方法2を参考にして、JNI(Java Native Interface)でJFrame(SunAwtFrame)のHWND(ウィンドウハンドル)を取得します。

概要

JNI Windowsでウインドウハンドラを取得する - Memo of Masterの方法2を参考にして、JNI(Java Native Interface) で JFrame(SunAwtFrame) の HWND(ウィンドウハンドル) を取得します。
JNI_HWND.png

環境

  • Microsoft Windows XP [Version 5.1.2600]
  • JDK 1.6.0_04
  • Microsoft Visual Studio .NET 2003\vc7

環境

  • Microsoft Windows XP [Version 5.1.2600]
  • JDK 1.6.0_04
  • Microsoft Visual Studio .NET 2003\vc7

解説

以下のようにコンパイル、実行するとフレームのタイルトバーにHWNDが表示されます。

サンプルコード

#spanend
#spanadd
import java.awt.*;
#spanend
#spanadd
import javax.swing.*;
#spanend

#spanadd
public class windowHandler{
#spanend
  public native static int getHWND(Object obj);
  static {
    System.loadLibrary("hwndTest");
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    try{
      //UIManager.getInstalledLookAndFeels();
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch(Exception e) {
      e.printStackTrace();
    }
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(320, 240);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    int hwnd = getHWND(frame);
    frame.setTitle("HWND: 0x"+Integer.toHexString(hwnd).toUpperCase());
  }
#spanadd
}
#spanend
#spanadd
#spanadd
#include "windowHandler.h"
#spanend
#spanadd
#include "jawt_md.h"
#spanend
#spanadd
#include <windows.h>
#spanend
#spanadd
JNIEXPORT jint JNICALL Java_windowHandler_getHWND(
#spanend
            JNIEnv *env, jobject jobj, jobject jframe) {
  JAWT awt;
  JAWT_DrawingSurface* ds;
  JAWT_DrawingSurfaceInfo* dsi;
  JAWT_Win32DrawingSurfaceInfo* dsi_win;
  jint lock;
  HWND hWnd;
  awt.version = JAWT_VERSION_1_4;
  if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
    return 0;
  }
  ds = awt.GetDrawingSurface(env, jframe);
  if (ds == NULL) {
    return 0;
  }
#spanadd

#spanend
  lock = ds->Lock(ds);
  if ((lock & JAWT_LOCK_ERROR) != 0) {
    awt.FreeDrawingSurface(ds);
    return 0;
  }
#spanadd

#spanend
  dsi = ds->GetDrawingSurfaceInfo(ds);
  if (dsi == NULL) {
    ds->Unlock(ds);
    awt.FreeDrawingSurface(ds);
    return 0;
  }
  dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
  hWnd = dsi_win->hwnd;
#spanadd

#spanend
  /* Free the drawing surface info */
  ds->FreeDrawingSurfaceInfo(dsi);
#spanadd

#spanend
  /* Unlock the drawing surface */
  ds->Unlock(ds);
#spanadd

#spanend
  /* Free the drawing surface */
  awt.FreeDrawingSurface(ds);
#spanadd

#spanend
  return (jint)hWnd;
#spanadd
}
#spanend
#spanadd

解説

以下のようにコンパイル、実行するとJFrameのタイルトバーにHWNDが表示されます。
#spanend
@echo off
SETLOCAL

"%JAVA_HOME%\bin\javac" windowHandler.java
"%JAVA_HOME%\bin\javah" -jni windowHandler

set SDK=C:\Program Files\Microsoft Visual Studio .NET 2003\vc7
#spanadd
rem set SDK=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
#spanend
"%SDK%\bin\cl.exe" /c -I"%SDK%\include" -I"%SDK%\PlatformSDK\include" -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -IhwndTest.h hwndTest.c

set LIB=%SDK%\lib;%SDK%\PlatformSDK\lib
"%SDK%\bin\link.exe" /DLL hwndTest.obj "%JAVA_HOME%\lib\jawt.lib"

set Path=%Path%;%JAVA_HOME%\jre\bin

"%JAVA_HOME%\bin\java" windowHandler

参考リンク

コメント

#spanend
#spanadd
import java.awt.*;
#spanend
#spanadd
import java.awt.peer.ComponentPeer;
#spanend
#spanadd
import javax.swing.*;
#spanend
#spanadd
import sun.awt.windows.WComponentPeer;
#spanend
#spanadd

#spanend
#spanadd
public class WComponentPeerTest {
#spanend
  public static long getHWnd(Frame f) {
    ComponentPeer p = f.getPeer();
    return p instanceof WComponentPeer ? ((WComponentPeer) p).getHWnd() : 0;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    f.setTitle("HWnd: " + getHWnd(f));
  }
#spanadd
}
#spanend
#spanadd

参考リンク

コメント