Nazdar všem.

Můj problém je následovný:
Mám Java aplikaci, kterou chci "minimalizovat do try lišty". Udělal jsem si proto pomocí JNI dll knihovnu ve které mám metody minimizeToTry a restoreFromTry. V Javě mám udělané native metody stejného jména, které volám. Po zavolání minimizeToTry se vytvoří neviditelné okno, jehož HWND se použije při vytvoření ikonky. Ikonka se v try liště ukáže a po restoreFromTry i správně zmizí. Moje otázka zní: Jak zajistit, aby se po kliknutí na ikonku v liště dalo vědět Java aplikaci, aby se mohla zobrazit a aby se zavolala restoreFromTry (nebo provedla něco jiného)? Poznámka: Samozřejmě je to jen pokusná verze, jaká ikonka tam bude a tak podobně neřeším :-)

Díky všem za rady  :-)


Global.java:
...
public static native void minimizeToTry(String title);
public static native void restoreFromTry();
...

dllmain.cpp:
#include "dll.h"

HWND hwnd;
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
BOOL createWindow(void);

JNIEXPORT void JNICALL Java_cz_pokus_Global_minimizeToTry(JNIEnv * jnienv, jclass jclass, jstring title){
jboolean isCopy;
const char *windowTitle = jnienv->GetStringUTFChars(title, &isCopy);

createWindow();

NOTIFYICONDATA nid = { 0 };
nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uID = ICON_1; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = MSG_MINTRAYICON; nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
strcpy(nid.szTip, windowTitle);

Shell_NotifyIcon(NIM_ADD, &nid);

return;
}

JNIEXPORT void JNICALL Java_cz_pokus_Global_restoreFromTry(JNIEnv * jnienv, jclass jclass){
NOTIFYICONDATA nid = {0};
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd;
nid.uID = ICON_1;
Shell_NotifyIcon(NIM_DELETE, &nid);

return;
}

BOOL createWindow(){
WNDCLASSEX wincl;

//wincl.hInstance = hThisInstance;
wincl.lpszClassName = "HLPWINDOW";
wincl.lpfnWndProc = WindowProcedure;      wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = NULL;
wincl.hIconSm = NULL;
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;  wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

if (!RegisterClassEx (&wincl)){
  printf("Chyba pri registrovani!!!
");
  return FALSE;
}

hwnd = CreateWindowEx (
0, "HLPWINDOW", "Pokus", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375,
         HWND_DESKTOP,
         NULL,
         NULL,           NULL           );
          return TRUE;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
switch (message){
/* Zde odchycenou message bych chtel poslat Java aplikaci */
  default:
    printf("Message: %i\n",message);
    return DefWindowProc (hwnd, message, wParam, lParam);
}
}

dll.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <windows.h>
#include <stdio.h>

#define ICON_1 10001
#define MSG_MINTRAYICON (WM_USER+1)

#ifndef _Included_cz_pokus_Global
#define _Included_cz_pokus_Global
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_cz_pokus_Global_minimizeToTry(JNIEnv *, jclass, jstring); JNIEXPORT void JNICALL Java_cz_pokus_Global_restoreFromTry(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif

Odpovedet emailem