怎么得到java句柄传给dll呢????

解决方案 »

  1.   

    借花献佛,网上找的
    package win32;
    public class Win32 {
        public static native int getWindowHandle(Component c);
    }/* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class win32_Win32 */#ifndef _Included_win32_Win32
    #define _Included_win32_Win32
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     win32_Win32
     * Method:    getWindowHandle
     * Signature: (Ljava/awt/Component;Ljava/lang/String;)I
     */
    JNIEXPORT jint JNICALL Java_win32_Win32_getWindowHandle
      (JNIEnv *, jclass, jobject);
    #ifdef __cplusplus
    }
    #endif
    #endif#include<windows.h>
    #include <jni.h>
    #include <jawt.h>
    #include <jawt_md.h>HMODULE _hAWT = 0;JNIEXPORT jint JNICALL Java_win32_Win32_getWindowHandle
      (JNIEnv * env, jclass cls, jobject comp)
    {
        HWND hWnd = 0;
        typedef jboolean (JNICALL *PJAWT_GETAWT)(JNIEnv*, JAWT*);
        JAWT awt;
        JAWT_DrawingSurface* ds;
        JAWT_DrawingSurfaceInfo* dsi;
        JAWT_Win32DrawingSurfaceInfo* dsi_win;
        jboolean result;
        jint lock;    //Load AWT Library
        if(!_hAWT)
            //for Java 1.4
            _hAWT = LoadLibrary("jawt.dll");
        if(!_hAWT)
            //for Java 1.3
            _hAWT = LoadLibrary("awt.dll");
        if(_hAWT)
        {
            PJAWT_GETAWT JAWT_GetAWT = (PJAWT_GETAWT)GetProcAddress(_hAWT, "_JAWT_GetAWT@8");
            if(JAWT_GetAWT)
            {
                awt.version = JAWT_VERSION_1_4; // Init here with JAWT_VERSION_1_3 or JAWT_VERSION_1_4
                //Get AWT API Interface
                result = JAWT_GetAWT(env, &awt);
                if(result != JNI_FALSE)
                {
                    ds = awt.GetDrawingSurface(env, comp);
                    if(ds != NULL)
                    {
                        lock = ds->Lock(ds);
                        if((lock & JAWT_LOCK_ERROR) == 0)
                        {
                            dsi = ds->GetDrawingSurfaceInfo(ds);
                            if(dsi)
                            {
                                dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
                                if(dsi_win)
                                {
                                    hWnd = dsi_win->hwnd;
                                }
         else {
         hWnd = (HWND) -1;
         }
                                ds->FreeDrawingSurfaceInfo(dsi);
                            }
         else {
         hWnd = (HWND) -2;
         }
                            ds->Unlock(ds);
                        }
         else {
         hWnd = (HWND) -3;
         }
                        awt.FreeDrawingSurface(ds);
                    }
         else {
         hWnd = (HWND) -4;
         }
                }
         else {
         hWnd = (HWND) -5;
         }
            }
         else {
         hWnd = (HWND) -6;
         }
        }
        else {
         hWnd = (HWND) -7;
        }
        return (jint)hWnd;
    据说 如果是64位的,需要将返回类型改为long
      

  2.   

    大哥,  请看http://bbs.csdn.net/topics/390344380?page=1#post-393458923    不我想要的是直接在java中把HAND传给dll啊,     不是在dll中转换啊         上面这个是转换的,我一样不会用,
      

  3.   

    handle是windows相关的,java里面没有直接的api来获取,利用上面的办法用native的方法获得然后在java中使用,上面是获取,是在c里面获取,否则你没什么其他办法