幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6007|回复: 14

[通用编程] windows XP下,我想自己弄个桌面widget可以不?

[复制链接]

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2012-9-21 17:14:55 | 显示全部楼层 |阅读模式
RT。。。

其实桌面工具就是自己做个窗口把??是不是这样哇?

想用wxWidget做,边学习边制作。。。

那么再有个问题。。。最小化到托盘怎么做?打开程序,托盘那里就多出个图标,最小化,任务栏就没有他,只能双击托盘图标才能出来,托盘图标也能右键菜单之类的,这个一直不会。。。
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-21 18:12:56 | 显示全部楼层
可以,这里面最有名的应用程序叫“伪春菜”。你google一下,就可以看多很多的有爱人士的无聊之作。

那么再有个问题。。。最小化到托盘怎么做?

在消息处理回调函数里,处理WM_SIZE消息就可以判断窗口是否已经最小化,具体用法google之

打开程序,托盘那里就多出个图标,


winapi函数Shell_NotifyIcon是用来创建,修改,删除托盘图标的。具体用法google之
最小化,任务栏就没有他,


不显示在任务栏,用SetWindowLong将应用程序窗口的风格改成WS_EX_TOOLWINDOW。 具体用法google之

只能双击托盘图标才能出来,托盘图标也能右键菜单之类的


定义一个自己的消息
unsigned int icon_message;
在消息循环处理中
WndProc(...)
{
       if(Message.Msg == icon_message)
       {
              if(Message.LParam == WM_LBUTTONDBLCLK)  //左键双击的消息
              {
                  .....
               }
       }
}
嘛,这些东西网上讲得很多。于是,惯例。具体google之。
え~え~お!!!
回复 支持 反对

使用道具 举报

0

主题

16

帖子

128

积分

③业余

积分
128
QQ
发表于 2012-9-21 18:17:46 | 显示全部楼层
没有什么东西是win32 api不能实现的,所以最好不要用别人的工具,除非你很了解你所用的工具是怎么实现的.
你所说的桌面工具是不是类似迅雷的桌面图标? 这个可以用SetDIBitsToDevice() + UpdateLayeredWindow()实现
系统托盘也不麻烦,我前段时间写过一个应用.我给你弄段关键代码:
  1. // 创建系统托盘
  2. void CreateSystemTray(NOTIFYICONDATAA* pOutIconData, HWND hWnd, UINT hIconID, UINT user_msg)
  3. {
  4. assert(pOutIconData != NULL);
  5. memset(pOutIconData, 0, sizeof(NOTIFYICONDATAA));
  6. HINSTANCE hInstance = (HINSTANCE)::GetWindowLong(hWnd, GWL_HINSTANCE);
  7. pOutIconData->cbSize = sizeof(NOTIFYICONDATAA);
  8. pOutIconData->hWnd = hWnd;
  9. pOutIconData->uID = hIconID;
  10. pOutIconData->uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
  11. pOutIconData->uCallbackMessage = user_msg; // WM_USER
  12. pOutIconData->hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(hIconID));
  13. }
  14. // 设置/隐藏系统托盘
  15. BOOL SetSystemTray(NOTIFYICONDATAA* pIconData, bool bShow=true)
  16. {
  17. assert(pIconData != NULL);
  18. BOOL bOK = FALSE;
  19. if (bShow)
  20.   bOK = Shell_NotifyIconA(NIM_ADD, pIconData);
  21. else
  22.   bOK = Shell_NotifyIconA(NIM_DELETE, pIconData);
  23. return bOK;
  24. }
  25. 用法示例:
  26. #define WM_USER_TRAY WM_USER+1
  27. #define IDM_OPEN  1
  28. #define IDM_EXIT  2
  29. NOTIFYICONDATAA  g_IconData;
  30. HMENU    g_hPopupMenu;
  31. // 创建系统托盘
  32. CreateSystemTray(&g_IconData, hWnd, IDI_ICON1, WM_USER_TRAY);
  33. // 创建系统托盘右键弹出菜单
  34. g_hPopupMenu = CreatePopupMenu();
  35. AppendMenuA(g_hPopupMenu, MF_STRING, IDM_OPEN, "打开");
  36. AppendMenuA(g_hPopupMenu, MF_STRING, IDM_EXIT, "退出");
  37.   
  38. // 窗口函数部分处理
  39. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  40. {
  41. switch (uMsg)
  42. {
  43. case WM_LBUTTONDOWN:
  44.   // 使鼠标单击窗口任何一个地方都能移动整个窗口
  45.   ::SendMessageA(hWnd, WM_SYSCOMMAND, 0xF012, 0);
  46.   break;
  47. case WM_SIZE:
  48.   {
  49.    switch (wParam)
  50.    {
  51.    case SIZE_MINIMIZED: // 这里通过点击最小化来设置系统托盘
  52.     {
  53.      SetSystemTray(&g_IconData); // 设置系统托盘
  54.      ShowWindow(hWnd, SW_HIDE);
  55.     }
  56.     break;
  57.    }
  58.   }
  59.   break;
  60. case WM_COMMAND:
  61.   {
  62.    WORD hWord = HIWORD(wParam);
  63.    WORD lWord = LOWORD(wParam);
  64.    switch(lWord)
  65.    {
  66.    case IDM_OPEN:
  67.     {
  68.      // 隐藏系统托盘
  69.      SetSystemTray(&g_IconData, false);
  70.      ShowWindow(hWnd, SW_SHOW);
  71.      SendMessageA(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
  72.     }
  73.     break;
  74.    case IDM_EXIT:
  75.     PostQuitMessage(0);
  76.     break;
  77.    }
  78.   }
  79.   break;
  80. case WM_USER_TRAY:
  81.   {
  82.    UINT msg = (UINT)lParam;
  83.    UINT id = (UINT)wParam;
  84.    if (id == IDI_ICON1)
  85.    {
  86.     // 左键单击就隐藏系统托盘,并显示窗口
  87.     if (msg == WM_LBUTTONDOWN)
  88.     {
  89.      // 隐藏系统托盘
  90.      SetSystemTray(&g_IconData, false);
  91.      ShowWindow(hWnd, SW_SHOW);
  92.      SendMessageA(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
  93.     }
  94.     // 右键单击后弹出菜单
  95.     if (msg == WM_RBUTTONDOWN)
  96.     {
  97.      POINT pos;
  98.      ::GetCursorPos(&pos);
  99.      TrackPopupMenu(g_hPopupMenu, TPM_RIGHTALIGN, pos.x, pos.y, NULL, hWnd, NULL);
  100.     }
  101.    }
  102.   }
  103.   break;
  104. case WM_DESTROY:
  105.   PostQuitMessage(0);
  106.   break;
  107. }
  108. return DefWindowProc(hWnd, uMsg, wParam, lParam);
  109. }
复制代码


另外,关于不规则半透明窗口请参见:
http://blog.csdn.net/weiwuyuan/article/details/8005090


示例程序(vs2008):
http://www.newmuhon.com/files/desktopTool.rar
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-21 19:49:55 | 显示全部楼层
LS两位真是好人,此刻我热泪盈眶


MFC我都不喜欢,怎么可能喜欢别人写的东西。这是什么样的执念啊。。。瓦咔咔!
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

0

主题

16

帖子

128

积分

③业余

积分
128
QQ
发表于 2012-9-22 01:16:10 | 显示全部楼层
弄了张多窗口的图,效果不错.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-22 18:24:10 | 显示全部楼层
  1. #include <windows.h>
  2. LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  3. {
  4.     switch(uMsg)
  5.     {
  6.     }
  7.     //调用缺省消息处理过程
  8.     //窗口处理消息中,系统提供一个默认消息处理函数
  9.     //做没有写出来的消息交给这个函数处理
  10.     return DefWindowProc(hwnd, uMsg, wParam, lParam);
  11. }
  12. #define App_width 800
  13. #define App_height 600
  14. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
  15. {
  16.     // 信息提示框
  17.     /*MessageBox(
  18.         NULL,       // 默认的窗口句柄
  19.         "窗口程序", // 信息框的内容
  20.         "提示信息", // 信息的标题
  21.         MB_YESNO);*/
  22.     // 创建窗口的过程:
  23.     // 1.创建窗口类,需要赋值
  24.     WNDCLASS wc;
  25.     wc.hInstance     = hInst;                                // 设置当前进程句柄
  26.     wc.lpszClassName = TEXT("2nDs_Desktop_Widget");            // 注册名字
  27.     wc.lpfnWndProc     = WinProc;                                // 设置当前窗口的信息处理函数
  28.     wc.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;// 窗口类的风格
  29.     wc.hIcon         = NULL;                                // 光标的设置
  30.     wc.hCursor         = LoadCursor(NULL, IDC_ARROW);            // 设置箭头光标
  31.     wc.lpszMenuName  = NULL;                                // 设置菜单(无菜单)
  32.     wc.cbClsExtra    = 0;                                    // 类的扩展字节数
  33.     wc.cbWndExtra    = 0;                                    // 窗口的扩展字节数
  34.     wc.hbrBackground = HBRUSH(GetStockObject(BLACK_BRUSH));    // 窗口背景的颜色
  35.     
  36.     // 2.注册窗口类
  37.     if(!RegisterClass(&wc)) // 取地址
  38.     {
  39.         MessageBox( NULL, TEXT("注册窗口类出错!"), TEXT("RegisterClass"), MB_OK) ;
  40.         return NULL;
  41.     }
  42.     // 3.创建窗口,定义窗口句柄
  43.     //窗口模式
  44.     HWND hWnd = CreateWindow(TEXT("2nDs_Desktop_Widget"),
  45.         TEXT("2nDs_Desktop_Widget"),
  46.         WS_POPUP | WS_SYSMENU | WS_VISIBLE,
  47.         CW_USEDEFAULT,
  48.         CW_USEDEFAULT,
  49.         CW_USEDEFAULT,
  50.         CW_USEDEFAULT,
  51.         NULL,
  52.         NULL,
  53.         hInst,
  54.         NULL);
  55.     if(hWnd == NULL)
  56.     {
  57.         MessageBox( NULL, TEXT("创建窗口出错!"), TEXT("CreateWindow"), MB_OK);
  58.         return NULL;
  59.     }
  60.     // 获取系统屏幕大小
  61.     int    Win_W = GetSystemMetrics(SM_CXSCREEN);
  62.     int Win_H = GetSystemMetrics(SM_CYSCREEN);
  63.     // 求出窗口居于屏幕中央时的左上角位置
  64.     int x1 = (Win_W - App_width) / 2;
  65.     int y1 = (Win_H - App_height) / 2 - 32;
  66.     // 根据上面的值,调整窗口的位置
  67.     SetWindowPos(hWnd, HWND_NOTOPMOST,
  68.         x1, y1, App_width, App_height,
  69.         SWP_HIDEWINDOW);
  70.     // 获取客户区的相对于屏幕左上角的位置
  71.     RECT rectWin;
  72.     GetClientRect(hWnd, &rectWin);
  73.     ClientToScreen(hWnd, (LPPOINT)&rectWin);
  74.     ClientToScreen(hWnd, (LPPOINT)&rectWin + 1);
  75.     // 4.显示窗口
  76.     ShowWindow(hWnd, SW_NORMAL); // 显示模式
  77.     // 窗口半透明
  78.     SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
  79.     SetLayeredWindowAttributes(hWnd,0,(255*70)/150,LWA_ALPHA);
  80.     // 5.更新窗口
  81.     UpdateWindow(hWnd);
  82.     
  83.     //6.消息循环
  84.     MSG  msg;    msg.message = WM_NULL;//存储消息结构体
  85.     //1.消息类型 : 1)命令消息 按钮
  86.     //               2)非命令消息 键盘、鼠标消息
  87.     //2.消息的附加消息:存储消息中的相关不同信息值
  88.     // typedef struct tagMSG {
  89.     //HWND hwnd;
  90.     //UINT message;
  91.     //WPARAM wParam; //消息的附加消息
  92.     //LPARAM lParam; //消息的附加消息
  93.     //DWORD time; //符号长整型 当前时间
  94.     //POINT pt; } //存储点的,鼠标的位置
  95.     //MSG;
  96.     //1.第二个参数是窗口句柄,如果传hWnd,说明要过滤消息
  97.     // 如果传NULL,说明处理所有的消息,后面两个参数为0
  98.     // 有消息就处理,没有消息就等待。
  99.     while(msg.message != WM_QUIT)
  100.     {
  101.         //if( GetMessage(&msg,NULL,0,0) )
  102.         if (PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  103.         {
  104.             //解析消息
  105.             TranslateMessage(&msg);
  106.             //分派消息
  107.             DispatchMessage(&msg);
  108.         }
  109.     }
  110.     //7.注销窗口类
  111.     UnregisterClass(TEXT("2nDs_Desktop_Widget"),  // 窗口类名字
  112.                     hInst); // 进程句柄
  113.     return (int)msg.wParam;
  114. }
复制代码


半透明桌面,没有标题栏。不出现任务栏还是不会弄T_T



还有 Alt+Tab和ALT+CTRL+DELETE都看不到这个程序,进程能看到怎么整哇?



就是整个程序就是迅雷的浮动窗口那样,或者是360显示流量的浮动窗口那样
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-22 18:31:36 | 显示全部楼层
WY那个程序 我用2010编译,显示找不到main.exe  
原来名字是main_D.exe我再看看去
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

0

主题

16

帖子

128

积分

③业余

积分
128
QQ
发表于 2012-9-22 20:23:16 | 显示全部楼层
引用第5楼secondsen于2012-09-22 18:24发表的 :
[code]#include <windows.h>

LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
.......


1:我那程序写的很明白了
2:不想在任务栏显示程序,可以这样子:
CreateWindowExA(WS_EX_LAYERED|WS_EX_TOOLWINDOW, ....);
3:不要标题栏,窗口style就填:WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU
4:SetLayeredWindowAttributes()函数只能指定一个全局透明度的窗口,而无法实现不规则半透明的窗口,就是你无法用一张带有alpha渐变的图去做窗口背景.
5:你给的代码因为没有绘制图像,所以没办法测试不规则半透明窗口,我给出的代码,已经能够实现你所需要的所有功能了.
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-22 22:53:33 | 显示全部楼层
style 只是WS_EX_LAYERED|WS_EX_TOOLWINDOW为啥任务栏还是有显示哇?
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

0

主题

16

帖子

128

积分

③业余

积分
128
QQ
发表于 2012-9-22 23:16:27 | 显示全部楼层
引用第8楼secondsen于2012-09-22 22:53发表的 :
style 只是WS_EX_LAYERED|WS_EX_TOOLWINDOW为啥任务栏还是有显示哇?


具体原因不清楚,我一直都是在创建的时候,指定这个属性,
就是在窗口还未显示的时候设置这个属性是没问题的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 07:00 , Processed in 0.025292 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表