000
16.02.2006, 17:54 Uhr
~paru2006
Gast
|
Hallo,
ich habe mir für ein Java Programm mit Hilfe des Java Native Interfaces eine DLL programmiert, die ein System Tray Icon erzeugt und ein Popup Menü anzeigen soll. Das Java Programm initialisiert die DLL korrekt und das Icon wird angezeigt. Leider passiert beim klicken mit der Maus nichts, d.h. es wird kein Menü angezeigt.
Hier mal der Code dazu:
C++: |
#include <jni.h> #include <windows.h> #include <process.h> #include <stdio.h>
#define WM_SYSTRAY (WM_APP+100)
HINSTANCE hInstance = NULL; HWND hWindow = NULL; HMENU hMenu; HICON hIcon; DWORD dThread;
BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD dwReason, LPVOID lReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: hInstance = (HINSTANCE)hInst; break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break; } return TRUE; }
LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); break;
case WM_COMMAND: break;
case WM_RBUTTONUP: if (LOWORD(lParam) == WM_RBUTTONUP) { POINT pt; GetCursorPos(&pt); TrackPopupMenu(hMenu, 0,pt.x, pt.y, 0, hWnd, NULL); } break; } return (DefWindowProc(hWnd, uMsg, wParam, lParam)); }
DWORD WINAPI ThreadProc(LPVOID) { MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
extern "C" JNIEXPORT jboolean JNICALL Java_add (JNIEnv *jEnv, jobject oObj, jint iIcon, jstring sToolTip) { WNDCLASS wClass; wClass.style = CS_HREDRAW | CS_VREDRAW; wClass.lpszClassName = "SysTrayClass"; wClass.lpfnWndProc = (WNDPROC)WndProc; wClass.hbrBackground = NULL; wClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wClass.hCursor = LoadCursor(NULL, IDC_ARROW); wClass.lpszMenuName = NULL; wClass.cbClsExtra = 0; wClass.cbWndExtra = 0; wClass.hInstance = hInstance;
if (!RegisterClass(&wClass)) return FALSE; hWindow = CreateWindow("SysTrayClass", "pSysTray", WS_POPUP, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING, 100, TEXT("Open")); AppendMenu(hMenu, MF_STRING, 101, TEXT("Save")); AppendMenu(hMenu, MF_SEPARATOR, 0, TEXT("")); AppendMenu(hMenu, MF_STRING, 102, TEXT("Exit"));
NOTIFYICONDATA nIcon; nIcon.cbSize = sizeof(NOTIFYICONDATA); nIcon.uID = 0; nIcon.hWnd = hWindow; nIcon.hIcon = (HICON)iIcon; nIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nIcon.uCallbackMessage = WM_SYSTRAY;
char const *cToolTip; cToolTip = jEnv->GetStringUTFChars(sToolTip, 0); strcpy(nIcon.szTip, cToolTip); BOOL bResult = Shell_NotifyIcon(NIM_ADD, &nIcon); jEnv->ReleaseStringUTFChars(sToolTip, cToolTip); if (hIcon) DestroyIcon(hIcon); CreateThread(NULL, 0, ThreadProc, 0, 0, &dThread); return bResult; }
extern "C" JNIEXPORT jboolean JNICALL Java_remove (JNIEnv *jEnv, jobject oObj) { NOTIFYICONDATA nIcon; nIcon.cbSize = sizeof(NOTIFYICONDATA); nIcon.uID = 0; nIcon.hWnd = hWindow; BOOL bResult = Shell_NotifyIcon(NIM_DELETE, &nIcon); DestroyMenu(hMenu); DestroyWindow(hWindow); return bResult; }
|
Wer kann mir hierbei helfen, ich denke mal dies wird ein Thread Problem sein.
Vielen Dank im Voraus |