Tips/JNI_HWND のバックアップの現在との差分(No.1)
TITLE:JNIでJFrameのHWNDを取得
JNIでJFrameのHWNDを取得
#adsense2
- title: JNIでJFrameのHWNDを取得 author: aterai pubdate: 2008-09-04 description: JNI(Java Native Interface)でJFrame(SunAwtFrame)のHWND(ウィンドウハンドル)を取得します。
概要
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(ウィンドウハンドル) を取得します。環境
- 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
参考リンク
- JNI Windowsでウインドウハンドラを取得する - Memo of Master
- -
JNI
を使用せず、以下のようにHWND
を取得する方法もあります。
- -
コメント
- winapi - In Java Swing how do you get a Win32 window handle (hwnd) reference to a window? - Stack Overflowに投稿されているJared MacD.さんのコードを引用
#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