如何在任务栏上增加一个类似于开始按钮的按钮,可参考360软件小助手或QQ桌面小助手

KingStarSolo 2013-01-21 04:10:28
RT,研究了很久无果。
我要做的这个软件类似于360软件小助手、QQ桌面小助手。

托盘图标完全满足不了我现在做的这个软件。


这个按钮并不是什么WIN7上的“将此程序锁定到任务栏”这么简单。
他完完全全是另外一个开始按钮,因为他的位置在开始按钮和其他“将此程序锁定到任务栏”的图标之间的一个按钮
求高手解答。
...全文
4847 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
u013330547 2014-07-03
  • 打赏
  • 举报
回复
+1 C#懂的就不多,Delphi完全不知道,关于那个注入explorer.exe ,思路貌似明白一点,但不会动手,求助!
zq1564171310 2014-07-03
  • 打赏
  • 举报
回复
请教楼主如何解决的?
zq1564171310 2014-07-02
  • 打赏
  • 举报
回复
完全看不懂
Delta 2014-03-20
  • 打赏
  • 举报
回复
引用 25 楼 ma_yingkun 的回复:
直接创建的话 会有问题的,钩子dll注入,m_hwndTask为你创建的窗口 1.子类化m_oldWndProcTask = (WNDPROC)GetWindowLong(m_hwndTask, GWL_WNDPROC); SetWindowLong(m_hwndTask, GWL_WNDPROC, (LONG)WndProcTask); WndProcTask里面自己处理WM_WINDOWPOSCHANGING消息,在这个消息里面调整位置 其他的消息交给系统处理 CallWindowProc(m_oldWndProcTask, hwnd, message, wParam, lParam); 2.子类化 MSTaskListWClass, 同上处理 LRESULT CALLBACK WndProcTask(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_WINDOWPOSCHANGING: // restrict size and position {//位置处理 } return CallWindowProc(m_oldWndProcTask, hwnd, message, wParam, lParam); } void UnSubclassStartButton(void) { if(m_hwndTask && IsWindow(m_hwndTask) && m_oldWndProcTask) SetWindowLong(m_hwndTask, GWL_WNDPROC, (LONG)m_oldWndProcTask); m_oldWndProcTask = NULL; } idThread = GetWindowThreadProcessId(hwndTaskbar, NULL); // 给任务栏安装一个hookg_hhook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc,g_hInst, idThread);
朋友,谢谢您提供相送消息。但我还有些不太懂,可以麻烦您说的再详细一些吗?我是学习C#的。谢谢
sss564 2013-12-04
  • 打赏
  • 举报
回复
注入explorer.exe ,获取任务栏的消息。调整程序图标显示位置。
ma_yingkun 2013-10-28
  • 打赏
  • 举报
回复
直接创建的话 会有问题的,钩子dll注入,m_hwndTask为你创建的窗口 1.子类化m_oldWndProcTask = (WNDPROC)GetWindowLong(m_hwndTask, GWL_WNDPROC); SetWindowLong(m_hwndTask, GWL_WNDPROC, (LONG)WndProcTask); WndProcTask里面自己处理WM_WINDOWPOSCHANGING消息,在这个消息里面调整位置 其他的消息交给系统处理 CallWindowProc(m_oldWndProcTask, hwnd, message, wParam, lParam); 2.子类化 MSTaskListWClass, 同上处理 LRESULT CALLBACK WndProcTask(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_WINDOWPOSCHANGING: // restrict size and position {//位置处理 } return CallWindowProc(m_oldWndProcTask, hwnd, message, wParam, lParam); } void UnSubclassStartButton(void) { if(m_hwndTask && IsWindow(m_hwndTask) && m_oldWndProcTask) SetWindowLong(m_hwndTask, GWL_WNDPROC, (LONG)m_oldWndProcTask); m_oldWndProcTask = NULL; } idThread = GetWindowThreadProcessId(hwndTaskbar, NULL); // 给任务栏安装一个hookg_hhook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc,g_hInst, idThread);
申城 2013-10-27
  • 打赏
  • 举报
回复
好高端的样子,都是大神
ma_yingkun 2013-10-25
  • 打赏
  • 举报
回复
逆向分析了360助手的代码,得到的方法就是程线程注入explorer.exe做的
ma_yingkun 2013-10-25
  • 打赏
  • 举报
回复
这个 很明显是 远程线程注入做的, 注入explorer.exe, 要32 和64为2个dll, 子类化 任务栏窗口过程,在自己的 窗口过程中实现
fengsirui 2013-10-19
  • 打赏
  • 举报
回复
仅仅将一个按钮放在任务栏里面而已,不要想的太复杂,不过按键的外观有点难搞
KingStarSolo 2013-01-23
  • 打赏
  • 举报
回复
楼上的 是什么 玩意?
gwg7107 2013-01-23
  • 打赏
  • 举报
回复
void treeView1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { files = (string[])(e.Data.GetData(DataFormats.FileDrop)); 。。。。。。。。。。。。。。。。。。 } } void treeView1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All; }
gwg7107 2013-01-23
  • 打赏
  • 举报
回复

发错图片了
gwg7107 2013-01-23
  • 打赏
  • 举报
回复



每个按钮的位置大小均可调,,快捷键直接在鼠标位置打开窗口。

KingStarSolo 2013-01-23
  • 打赏
  • 举报
回复
求解答···
KingStarSolo 2013-01-23
  • 打赏
  • 举报
回复
引用 19 楼 bdmh 的回复:
本帖最后由 bdmh 于 2013-01-23 14:04:21 编辑 下面是一段delphi代码,你在c# 中引入api 即可 C# code?123456789101112131415161718192021222324252627282930procedure TForm1.Button1Click(Sender: TObject)……
你是我的上帝··· 这就是我 想要的····分你拿去···其他楼也谢谢你们 参与
bdmh 2013-01-23
  • 打赏
  • 举报
回复
下面是一段delphi代码,你在c# 中引入api 即可

procedure TForm1.Button1Click(Sender: TObject);
var
i:HWND;
cs:CREATESTRUCT;
begin
// i := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil);
i := FindWindow('Shell_TrayWnd', nil);//这里可以通过FindWindowEx找到开始按钮,并得到他的按钮区域( GetWindowRect ),并以此来指定新按钮的区域
cs.lpszClass:= 'Button';
cs.lpszName:= '我的按钮';
cs.style:= WS_CHILD or WS_VISIBLE or WS_BORDER;
cs.hMenu:= 0;
cs.hwndParent:= i;
cs.lpCreateParams:= nil;
cs.x:= 100;
cs.y:= 0;
cs.cx:= 20;
cs.cy:= 30;
cs.hInstance:= 0;
i := CreateWindow(cs.lpszClass,
cs.lpszName,
cs.style,
cs.x,
cs.y,
cs.cx,
cs.cy,
cs.hwndParent,
cs.hMenu,
cs.hInstance,
cs.lpCreateParams);
end;

就是右边这个白色的
nonocast 2013-01-22
  • 打赏
  • 举报
回复
那就考虑替代开始啊...
KingStarSolo 2013-01-22
  • 打赏
  • 举报
回复
继续顶起·····
KingStarSolo 2013-01-22
  • 打赏
  • 举报
回复
引用 9 楼 nonocast 的回复:
引用 6 楼 Gary87517 的回复:5楼的也不是我想要的。难道就没有人用过这2款软件? 我感觉思路应该是获取到系统Menu的句柄(GetSystemMenu) 然后在这个Menu上增加按钮 我用过360,看到一次这样的图标删一次,何必呢?
个人喜好不同·这样的软件放那个位置最合适不过了,最好能代替开始按钮
加载更多回复(10)

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧