亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? windowstrayicon.cpp

?? 用Java實現Windows系統托盤圖標源碼1
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
	if (tray_icons[m_IDNum].used == FALSE) return TRAY_WRONGICONID;
	jobject obj = tray_icons[m_IDNum].globalClass;
	if (obj == 0) return TRAY_NOLISTENER;
	jclass winTrayClass = env->GetObjectClass(obj);
	if (winTrayClass == 0) return TRAY_NOTENOUGHMEM;
	// Get callback method id
	jmethodID mid = env->GetMethodID(winTrayClass, "notifyMouseListeners", "(IIII)V");
	if (mid == 0) return TRAY_METHODID;
	// Call method "notifyMouseListeners"
	env->CallVoidMethod(obj, mid, m_Button, m_Mask, m_Pos.x, m_Pos.y);
	return TRAY_NOERR;
}

BalloonJavaCallback::BalloonJavaCallback(int idnum, int mask) {
    m_Mask = mask;
    m_IDNum = idnum; 
}

int BalloonJavaCallback::execute(JNIEnv* env) {
	// Valid icon id and valid global reference to icon's Java class?
	if (tray_icons[m_IDNum].used == FALSE) return TRAY_WRONGICONID;
	jobject obj = tray_icons[m_IDNum].globalClass;
	if (obj == 0) return TRAY_NOLISTENER;
	jclass winTrayClass = env->GetObjectClass(obj);
	if (winTrayClass == 0) return TRAY_NOTENOUGHMEM;
	// Get callback method id
	jmethodID mid = env->GetMethodID(winTrayClass, "notifyBalloonListeners", "(I)V");
	if (mid == 0) return TRAY_METHODID;
	// Call method "notifyMouseListeners"
	env->CallVoidMethod(obj, mid, m_Mask);
	return TRAY_NOERR;
}

// Call a Java method in a given virtual machine
int CallJavaVM(JavaVM* vm, ThreadJavaCallback* call) {
	int result = TRAY_NOERR;
	JNIEnv* env;
	// Attach current thread to given Java VM
	if (vm->AttachCurrentThread((void**) &env, NULL) < 0) return TRAY_ERRTHREAD;
	// Call method (MousePressedCallback/MenuItemCallback/WindowsMessageCallback/..)
	result = call->execute(env);
	// Check for exception detach thread and exit
	if (env->ExceptionOccurred()) env->ExceptionDescribe();
	vm->DetachCurrentThread();
	return result;
}

// Thread proc to call Java method (calls CallJavaVMS but with wrapped params)
void CallJavaThread(void *arg) {
	ThreadJavaCallback *tjc = (ThreadJavaCallback*)arg;
	int result = CallJavaVM(hJavaVM, tjc);
	if (result != TRAY_NOERR) last_error = result;
	delete tjc;
}

// Call a Java method in a new thread
void CallJavaVMSThread(ThreadJavaCallback* tjc) {
	if (_beginthread(CallJavaThread, 0, tjc) == -1) delete tjc;
}

SimpleJavaCallback::SimpleJavaCallback(JNIProcPtr(jniproc), int arg1, int arg2) {
    m_JNIProc = jniproc;
    m_Arg1 = arg1;
    m_Arg2 = arg2;
}

int SimpleJavaCallback::execute(JNIEnv* env) {
    return m_JNIProc(env, m_Arg1, m_Arg2);
}

// Handle popup menu command
void HandleMenuCommand(WPARAM menuId) {
	// Get icon id given menu id
	int id_num = getMenuItemIdNum(menuId);
	// Callback to Java class in new thread, using method "MenuItemCallback()"
	SimpleJavaCallback* call = new SimpleJavaCallback(MenuItemCallback, id_num, menuId);
	CallJavaVMSThread(call);
}

// Handle icon mouse event (left/right button)
void HandleNotifyIcon(WPARAM id_num, LPARAM lParam) {	
    if (lParam == WM_RBUTTONDOWN || lParam == NIN_KEYSELECT || lParam == NIN_SELECT || lParam == WM_CONTEXTMENU) {
		if (id_num >= 0) {
		    POINT mouse_pos;
			GetCursorPos(&mouse_pos);				
			// If menu defined, then show it
			if (tray_icons[id_num].popup != NULL) {
				// Display and track the popup menu
				PopupMenu *menu = tray_icons[id_num].popup;
				menu->TrackPopupMenu(TPM_RIGHTALIGN | TPM_RIGHTBUTTON,&mouse_pos,my_hDlg);
			} else {
				// Callback Java class in new thread using "MousePressedCallback()"
		                MouseJavaCallback* call = new MouseJavaCallback(id_num, 1, 0, &mouse_pos);
				CallJavaVMSThread(call);					
			}
		}
    } else {
		int button = -1;
        	int mask = 0;
	        switch (lParam)	{
		    case WM_LBUTTONDOWN:
		        button = 0; break;
		    case WM_MBUTTONDOWN:
		        button = 2; break;
		    case WM_LBUTTONUP:
		        button = 0; mask |= MOUSE_BTN_UP; break;
		    case WM_MBUTTONUP:
		        button = 2; mask |= MOUSE_BTN_UP; break;
		    case NIN_KEYSELECT:
		    case NIN_SELECT:
		    case WM_CONTEXTMENU:
	            case WM_RBUTTONUP:
		        button = 1; mask |= MOUSE_BTN_UP; break;
	            case WM_LBUTTONDBLCLK:
        	        button = 0; mask |= MOUSE_BTN_DOUBLE; break;
	            case WM_RBUTTONDBLCLK:
	                button = 1; mask |= MOUSE_BTN_DOUBLE; break;
        	    case WM_MBUTTONDBLCLK:
	                button = 2; mask |= MOUSE_BTN_DOUBLE; break;
	            case NIN_BALLOONSHOW:
	            	button = 3; mask |= BALLOON_MSG_SHOW; break;
	            case NIN_BALLOONHIDE:
			button = 3; mask |= BALLOON_MSG_HIDE; break;
	            case NIN_BALLOONTIMEOUT:
			button = 3; mask |= BALLOON_MSG_TIMEOUT; break;	            
	            case NIN_BALLOONUSERCLICK:
			button = 3; mask |= BALLOON_MSG_CLICK; break;	                
        	}
		if (id_num >= 0 && button != -1) {
			if (button == 3) {
				BalloonJavaCallback* call = new BalloonJavaCallback(id_num, mask);
				CallJavaVMSThread(call);				
			} else {
				MouseJavaCallback* call = new MouseJavaCallback(id_num, button, mask);
				GetCursorPos(call->getPos());
				CallJavaVMSThread(call);
			}
		}        
    }	
}

void ReAddAllIcons() {
	for (int id_num = 0; id_num < MY_MAX_ICONS; id_num++) {
		if (tray_icons[id_num].visible == TRUE) {
			showIcon(id_num);
		}
	}
}

int HandleAppTalk(int value) {
	SimpleJavaCallback call(WindowsMessageCallback, 0, value);
	return CallJavaVM(hJavaVM, &call);
}

int HandleAppMouse(int xp, int yp) {
	SimpleJavaCallback call(MouseHookCallback, xp, yp);
	return CallJavaVM(hJavaVM, &call);
}

// Windows message proc for hidden window
// Receives mouse/menu events for the apps tray icons
LONG APIENTRY WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam) {
	switch (iMessage) {
		case WM_DESTROY:
			// Exit message thread
			PostQuitMessage(0) ;
			break;
		case MYWM_NOTIFYICON:
			// Mouse event for icon (left/right button)
			HandleNotifyIcon(wParam, lParam);
			break;
		case MYWM_APPTALK:
			// ID used for sendWindowsMessage()
			// Callback Java class using "WindowsMessageCallback()"
			return HandleAppTalk((int)lParam);
		case MYWM_APPMOUSE:
			// Handle mouse message (from global hook)
			return HandleAppMouse((int)wParam, (int)lParam);
		case WM_COMMAND:
			// Menu command for icon
			HandleMenuCommand(LOWORD(wParam));
			break;		
			// Get notified if task bar restarts
		case WM_CREATE:
            		g_TaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
			break;
		// Do nothing for other messages		    
		case WM_GETMINMAXINFO:
		case WM_PAINT:
		case WM_MOUSEMOVE:
		case WM_RBUTTONDOWN:
		case WM_RBUTTONUP:
		case WM_MOVE:
		case WM_SIZE:
		case WM_LBUTTONDOWN:
		case WM_KEYDOWN:
			break;
		    // Or use default handler
		default:
			if (iMessage == g_TaskbarRestart) ReAddAllIcons();
			else return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
	}
	return 0L ;
}

// Create the hidden window to receive the icon's mouse messages
HWND MakeHWND(HINSTANCE hInst) {
	HWND hWnd;
	// Create window class
	WNDCLASS wndclass;
	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc   = (WNDPROC) WndProc;
	wndclass.cbClsExtra    = 0;
	wndclass.cbWndExtra    = 0;
	wndclass.hInstance     = hInst;
	wndclass.hIcon         = LoadIcon(hInst, IDI_APPLICATION);
	wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wndclass.lpszMenuName  = NULL;
	wndclass.lpszClassName = szAppName;
	if (!RegisterClass(&wndclass)) return NULL;
	// Create window
	hWnd = CreateWindow(szAppName, szWndName, WS_OVERLAPPEDWINDOW,
                          0,0,100,100,
                          NULL, NULL, hInst, NULL);
	return hWnd;
}

// Remove the hidden window (on app closing)
void RemoveHWND() {
	// Close dial
	if (my_hDlg != NULL) {
		// Create wait event
		exit_event = CreateEvent(NULL,FALSE,FALSE,NULL);
		// Send destroy messages
		PostMessage(my_hDlg, WM_NCDESTROY, 0, 0);
		PostMessage(my_hDlg, WM_DESTROY, 0, 0);
		// Wait for window to destroy
		WaitForSingleObject(exit_event,10000);
		CloseHandle(exit_event);
		exit_event = NULL;
	}
	// Free handle
	if (wait_event != NULL) {
		CloseHandle(wait_event);
		wait_event = NULL;
	}
}

// The thread proc that creates the hidden window an listens for messages
void DialogThread(void *dummy) {
	MSG msg;
	// Create window
	my_hDlg = MakeHWND(g_hinst);
	// Signal wait event
	if (wait_event != NULL) SetEvent(wait_event);
	// Hide window
	ShowWindow(my_hDlg, SW_HIDE);
	UpdateWindow(my_hDlg);
	// Process messages
	while (GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg) ;
		DispatchMessage(&msg) ;
	}
	// Unregister window class
	UnregisterClass(szAppName, g_hinst);
	// Signal exit event (so app knows hidden window is destroyed)
	if (exit_event != NULL) SetEvent(exit_event);
}

JNIEXPORT void JNICALL Java_com_jeans_trayicon_WindowsTrayIcon_setAlwaysOnTop(JNIEnv *env, jclass cls, jobject win, jboolean onTop) {
    DoAlwaysOnTop top;
    doWithHWND(&top, env, win);
}

int DoAlwaysOnTop::execute(HWND hwnd) {
    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
    return 0;
}

void doWithHWND(DoWithHWND* hwndProc, JNIEnv* env, jobject window) {    
    if (hJAWT == NULL) {
        last_error = TRAY_NO_JAWT;
        return;
    }
    PJAWT_GETAWT JAWT_GetAWT = (PJAWT_GETAWT)GetProcAddress(hJAWT, "_JAWT_GetAWT@8");
    if (JAWT_GetAWT == NULL) {
        last_error = TRAY_NO_GET_JAWT;
        return;
    }
    JAWT awt;
    awt.version = JAWT_VERSION_1_3;
    jboolean result = JAWT_GetAWT(env, &awt);
    if (result == JNI_FALSE) {
        last_error = TRAY_GET_JAWT_FAILS;
        return;
    }    
    JAWT_DrawingSurface* ds = awt.GetDrawingSurface(env, window);
    if (ds == NULL) {
        last_error = TRAY_JAWT_DS_FAILS;
        return;
    }    
    jint lock = ds->Lock(ds);
    if ((lock & JAWT_LOCK_ERROR) == 0) {                                                                                     
        JAWT_DrawingSurfaceInfo* dsi = ds->GetDrawingSurfaceInfo(ds);
        JAWT_Win32DrawingSurfaceInfo* dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
        hwndProc->execute(dsi_win->hwnd);
        ds->FreeDrawingSurfaceInfo(dsi);
        ds->Unlock(ds);                                                            
    } else {
        last_error = TRAY_JAWT_LOCK_FAILS;
    }
    awt.FreeDrawingSurface(ds);                                                      
}  

void RemoveJAWT() {
    if (hJAWT != NULL) {
        FreeLibrary(hJAWT);
        hJAWT = NULL;
    }
}

void RemoveHook() {
	if (hMouseClickHook != NULL) {
		UnhookWindowsHookEx(hMouseClickHook);
		hMouseClickHook = NULL;
	}
}

void GetJAWTHandle() {
	if (hJAWTTried == 0 && hJAWT == NULL) {
		hJAWTTried = 1;
		hJAWT = LoadLibrary("jawt.dll");
		if (hJAWT == NULL) {
			char* jawt_path = find_in_path("../jre/bin/jawt.dll");
			if (jawt_path != NULL) hJAWT = LoadLibrary(jawt_path);
		}
		if (hJAWT == NULL) {
			last_error = TRAY_NO_JAWT;
		}
	}
}

// New icon resource with no bitmap and zero size
IconData::IconData() {
	wd = hi = 0;
	hBitmapAND = hBitmapXOR = NULL;
}

// Destroy icon resources (and and xor bitmap)
IconData::~IconData() {
	if (hBitmapAND != NULL) DeleteObject(hBitmapAND);
	if (hBitmapXOR != NULL) DeleteObject(hBitmapXOR);
}

// Make icon using and and xor bitmaps (returns handle to new icon)
HICON IconData::makeIcon(HINSTANCE hInst) {
        ICONINFO ii;
        ii.fIcon    = TRUE;
        ii.xHotspot = 0;
        ii.yHotspot = 0;
        ii.hbmMask  = hBitmapAND;
        ii.hbmColor = hBitmapXOR;
        return CreateIconIndirect(&ii);
}

// Set icon's image data (pixel array, width, height)
int IconData::setData(unsigned long *data, int wd, int hi) {
	int res = -1;
	// Set size
	this->wd = wd;
	this->hi = hi;
	// Clean up if setData was called before
	if (hBitmapAND != NULL) DeleteObject(hBitmapAND);
	if (hBitmapXOR != NULL) DeleteObject(hBitmapXOR);
	// To protect against java sending a dud image
	if (wd > 0 && hi > 0) {
		    // Set up the header for creating our 24 bit colour bitmap
	    	BITMAPINFOHEADER bih;
		    bih.biSize          = sizeof(BITMAPINFOHEADER);
	    	bih.biWidth         = wd;
		    bih.biHeight        = hi;
		    bih.biPlanes        = 1;
	    	bih.biBitCount      = 24;
	    	bih.biCompression   = BI_RGB;
	    	bih.biSizeImage     = 0;
	    	bih.biXPelsPerMeter = 0;
	    	bih.biYPelsPerMeter = 0;
	    	bih.biClrUsed       = 0;
	    	bih.biClrImportant  = 0;
	    	// Create memory DC
	    	HDC hdc = CreateCompatibleDC(NULL);
	    	// Make the 24-bit DIB
	    	hBitmapXOR = CreateDIBSection(hdc, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (LPVOID *)NULL, NULL, 0);
	    	// Select it into the DC so we can draw onto it
	    	SelectObject(hdc, hBitmapXOR);
	    	// Calloc memory to be used to create a monochrome bitmask
		long size = (wd*hi/8)+1;
	    	unsigned char *andMask = new unsigned char[size];
		if (andMask != NULL) {
			    for (int i = 0; i < size; i++) andMask[i] = 0;
				// Loop through the given pixels and draw onto the colour and mono bitmaps
				unsigned long pixel;
		        	unsigned char red, green, blue, alpha;
		        	for (int row = 0; row < hi; row++) {
    			    	for (int col = 0; col < wd; col++) {
	            			pixel = data[(row*wd)+col];
		            		alpha = (unsigned char)((pixel >> 24) & 0x000000ff);
		          

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久欧美中文字幕| 亚洲女人****多毛耸耸8| 欧美一二区视频| 欧美成人精品二区三区99精品| 欧美电影精品一区二区| 久久免费偷拍视频| 中文字幕亚洲区| 亚洲成av人片一区二区三区| 日韩成人dvd| 国产成人一级电影| 欧美无人高清视频在线观看| 精品剧情v国产在线观看在线| 国产精品久久免费看| 午夜精品久久久久影视| 国产精品亚洲а∨天堂免在线| av在线不卡观看免费观看| 4hu四虎永久在线影院成人| 久久久蜜臀国产一区二区| 亚洲欧美偷拍卡通变态| 日本欧美韩国一区三区| 99免费精品在线| 精品99久久久久久| 偷窥国产亚洲免费视频| 国产99久久久国产精品| 欧美激情一区二区三区| 国产精品久久久久久久第一福利 | 色乱码一区二区三区88| 日韩精品中文字幕一区二区三区 | 国产在线视视频有精品| 成人永久免费视频| 日韩一区二区三区免费看| 日韩毛片精品高清免费| 国产一区二区中文字幕| 欧美一区二区性放荡片| 樱桃国产成人精品视频| 99免费精品视频| 亚洲欧美另类图片小说| 成人黄色在线看| 国产三级欧美三级日产三级99 | 欧美r级在线观看| 久久精品一二三| 亚洲成人av一区二区| 色就色 综合激情| 一区二区在线看| 欧美一级日韩一级| 日韩 欧美一区二区三区| 91精品婷婷国产综合久久性色| 亚洲成人资源在线| 91麻豆精品91久久久久同性| 五月天亚洲婷婷| 69堂亚洲精品首页| 老汉av免费一区二区三区| 欧美一区二区三区在| 久久精品国产99久久6| 日韩久久免费av| 国产精华液一区二区三区| 国产三区在线成人av| 91视频91自| 日韩免费观看2025年上映的电影 | 91蝌蚪国产九色| 亚洲一区二区成人在线观看| 欧美一区二区三区四区五区| 国模套图日韩精品一区二区| 亚洲欧洲一区二区在线播放| 在线中文字幕不卡| 精品影院一区二区久久久| 国产喷白浆一区二区三区| 色欧美乱欧美15图片| 九九热在线视频观看这里只有精品| 亚洲国产精品传媒在线观看| 在线亚洲一区观看| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美性做爰猛烈叫床潮| 婷婷综合另类小说色区| 中文字幕亚洲一区二区av在线| 欧美日韩久久久| 91尤物视频在线观看| 精品无人码麻豆乱码1区2区 | 国内精品久久久久影院薰衣草| 亚洲乱码国产乱码精品精98午夜 | 国产一区二区三区精品视频| 亚洲国产精品一区二区尤物区| 久久日韩精品一区二区五区| 国产一区二区在线影院| 91精品国产综合久久久久久 | 成人免费在线视频| 精品欧美一区二区在线观看| 欧美日韩激情在线| 一本大道久久a久久精品综合| 丁香天五香天堂综合| 国内偷窥港台综合视频在线播放| 午夜精品影院在线观看| 亚洲乱码国产乱码精品精可以看 | 国内欧美视频一区二区| 免费成人在线播放| 六月丁香综合在线视频| 秋霞午夜av一区二区三区| 99这里只有精品| 另类小说欧美激情| 极品少妇xxxx偷拍精品少妇| 美女爽到高潮91| 精品综合久久久久久8888| 捆绑调教美女网站视频一区| 蓝色福利精品导航| 国产91精品在线观看| 波多野洁衣一区| 日本丰满少妇一区二区三区| 一本久道久久综合中文字幕| 色成年激情久久综合| 欧美在线三级电影| 日韩欧美中文一区| 久久午夜羞羞影院免费观看| 国产精品色婷婷| 亚洲欧美日韩国产手机在线| 亚洲一区二区偷拍精品| 精品综合免费视频观看| 成人动漫一区二区三区| 日韩欧美在线影院| 日韩精品一区二区三区中文不卡| 2021国产精品久久精品| 免费一级片91| 国产91丝袜在线观看| 欧美日韩亚洲不卡| 日韩免费观看2025年上映的电影| 亚洲欧洲成人精品av97| 日韩av一区二区在线影视| 成人涩涩免费视频| 制服丝袜在线91| 亚洲欧美另类综合偷拍| hitomi一区二区三区精品| 美女一区二区视频| 丰满少妇在线播放bd日韩电影| 色欧美乱欧美15图片| 久久九九99视频| 日韩高清电影一区| 欧美制服丝袜第一页| 国产午夜精品美女毛片视频| 日本aⅴ亚洲精品中文乱码| 91丨九色porny丨蝌蚪| 国产日韩精品一区二区浪潮av| 亚洲一区二区三区四区在线免费观看 | 91污片在线观看| 国产拍欧美日韩视频二区| 免费高清视频精品| 欧美精品色综合| 国产一区二区不卡老阿姨| 欧美日韩不卡一区二区| 亚洲一区二区在线视频| 在线亚洲+欧美+日本专区| 中文字幕中文在线不卡住| 成人黄色av电影| 国产精品人人做人人爽人人添| 成人午夜视频在线| 欧美激情中文字幕| av网站一区二区三区| 亚洲天堂av一区| 欧美性xxxxx极品少妇| 亚洲国产日韩av| 91精品国产入口在线| 免费观看30秒视频久久| 亚洲精品一区二区三区香蕉 | 国产精品1区二区.| 欧美激情综合五月色丁香小说| 丁香亚洲综合激情啪啪综合| 国产精品久久久久三级| 一本色道久久综合亚洲精品按摩| 一区二区三区丝袜| 日韩一区二区在线看片| 国产黄人亚洲片| 中文字幕字幕中文在线中不卡视频| 91福利精品第一导航| 日本中文字幕一区| 久久久三级国产网站| 99精品热视频| 日韩影视精彩在线| 国产精品免费视频网站| 在线播放亚洲一区| 成人午夜免费视频| 免费在线观看不卡| 国产精品三级av| 欧美疯狂性受xxxxx喷水图片| 国产黄人亚洲片| 香蕉久久一区二区不卡无毒影院| 久久亚洲捆绑美女| 国产婷婷色一区二区三区四区| 成人精品鲁一区一区二区| 日韩精品一区二区三区视频 | 一本到三区不卡视频| 美女尤物国产一区| 亚洲伊人伊色伊影伊综合网| 久久精品视频在线免费观看| 91精品国产综合久久久久久| 色视频成人在线观看免| 国产高清亚洲一区| 九九九久久久精品| 蜜桃视频一区二区三区| 亚洲成av人片在www色猫咪| 一区二区三区成人在线视频| 国产精品全国免费观看高清| 中文字幕免费观看一区|