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