首页
社区
课程
招聘
[求助]高手能不能写一个功能类似MoveToTray的小软件呀,不要.net的
发表于: 2014-6-25 11:51 4474

[求助]高手能不能写一个功能类似MoveToTray的小软件呀,不要.net的

2014-6-25 11:51
4474
高手能不能写一个功能类似MoveToTray的小软件呀,不要.net的。

目前在用move to tray的小软件,就是可以把当前窗口加入到系统托盘,这个比较实用的。知道这里高手如云,那位高手要不要试试水,写一个。但不要.net的。要安装几十兆的框架,不方便。单文件,便携,绿色。

谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 25
活跃值: (477)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
2
不难吧   注入就可以了
2014-6-25 12:29
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
右下角的那个tray其实是move to tray进程里面加的,你关闭move to tray就知道了,至于隐藏么直接用的ShowWindow即可
你注册的时候 NOTIFYICONDATA.uID  写成对应隐藏的hwnd就可以了,消息循环的wparam会把这个uID传过来的,都不用列表什么保存窗口了
2014-6-25 17:46
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
#include <windows.h>
#include <ShellAPI.h>
#include "resource.h"

PNOTIFYICONDATA Icon;  //右下角图标的一个结构体指针
#define ID_SHOW 0x5000

void move_Middle(HWND hWnd)
{
	RECT rect;
	int x,y;
	GetWindowRect(hWnd, &rect);//得到当前窗口大小信息
	x = rect.right - rect.left;
	y = rect.bottom - rect.top;
	MoveWindow(hWnd, (GetSystemMetrics(SM_CXSCREEN)- x)>>1, (GetSystemMetrics(SM_CYSCREEN)-y)>>1, x, y , TRUE);
}

INT_PTR CALLBACK ProcWinMain(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	static HMENU hmenu;
	static HINSTANCE hInst;
	hInst=(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);

	hmenu=LoadMenu(hInst,"MYPOPUPMENU");
	hmenu=GetSubMenu(hmenu,0);
	HWND hwndfrontwin;


	int iFileNum = 0 ;
	char FileName[MAX_PATH];
	int i;
	switch(Msg)
	{
		case WM_INITDIALOG:
			RegisterHotKey(hWnd, ID_SHOW, NULL, VK_F2);
			move_Middle(hWnd);
			break;

		case WM_USER+0x100://右下角图标事件
			switch(lParam)
			{
			case WM_LBUTTONDBLCLK: //双击,显示隐藏窗体
				ShowWindow((HWND)wParam, SW_SHOW);
				Icon->uID = wParam;
				Shell_NotifyIcon(NIM_DELETE,Icon);
				break;
			}
			break;

		case WM_HOTKEY://处理热键消息
			switch(wParam)
			{
				case ID_SHOW:

					hwndfrontwin = GetForegroundWindow();
					if (hwndfrontwin == hWnd)
					{
						Icon->hIcon = LoadIcon(hInst, (LPCSTR)IDI_ICON1);
					}
			                else
			                {
				                if (!SendMessageTimeout(hwndfrontwin, WM_GETICON, 0, 0, 
				                    SMTO_BLOCK | SMTO_ABORTIFHUNG, 15000, (PULONG_PTR) &Icon->hIcon)
				                    || NULL == Icon->hIcon)
				                	Icon->hIcon = (HICON)(PLONG)GetClassLongPtr(hwndfrontwin, GCLP_HICONSM);
			                }
					Icon->uID = (UINT)hwndfrontwin;
					GetWindowText(hwndfrontwin, Icon->szTip, 64);
					Shell_NotifyIcon(NIM_ADD,Icon);
					ShowWindow(hwndfrontwin, FALSE);

					break;
			}
			break;

		case WM_SHOWWINDOW:
			Icon->hWnd = hWnd;
			move_Middle(hWnd);
			break;

		case WM_COMMAND:
			//用户自定义消息
			switch(wParam) 
			{
				case IDOK:
				case IDCANCEL:
					PostMessage(hWnd, WM_CLOSE, NULL, NULL);
					break;
			}	
			break;

		case WM_CLOSE:
			// 这里要把之前所有隐藏的窗口显示出来
			UnregisterHotKey(hWnd, ID_SHOW);
			EndDialog(hWnd, 0);
			break;

		default:
			return FALSE;
			break;
	}
	return 0;
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	Icon = new NOTIFYICONDATA;
	ZeroMemory(Icon,sizeof(Icon));
	Icon->cbSize = sizeof(Icon);
	Icon->uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
	Icon->uCallbackMessage = WM_USER+0x100 ;

	//显示窗口
	DialogBoxParam(hInstance,(LPCSTR)IDD_DIALOG1 ,NULL, (DLGPROC)ProcWinMain, NULL);
	return TRUE;
}


窗口资源自己随便加一个, 还有资源加一个 IDI_ICON1 的图标文件。 按F2隐藏到那个啥啥啥NotifyIcon,双击还原,关闭程序再次显示出来的自己写,要弄个数组什么的保存了。
2014-6-25 18:18
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼上高手啊
2014-6-26 00:47
0
雪    币: 230
活跃值: (429)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你们都是高手,我压根不会应用程序。俺只会PHP代码。其它的代码一概看不明白。呵呵,不过现在找到了一款。RBTray,有兴趣的话,大家也使用一下。

如果有一个软件能有taskbar shuffle的功能+RBTray的功能是最方便的了。我就可以不用其它的软件辅助了。
2014-6-27 08:20
0
雪    币: 202
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
简洁,厉害!!
2014-6-27 09:16
0
游客
登录 | 注册 方可回帖
返回
//