关于隐藏和重现进程程序、隐藏和重现系统托盘图标

weidegong 2005-01-07 04:17:10
现在看到很多软件可以列出系统正在运行的进程,隐藏指定条件的进程程序,然后还可以重现它;另外可以控制系统托盘的图标隐藏和重现,请教高人指点一下这些是如何实现的?

有封装好的控件最好不过了,没有的话,希望能指条明路应该从何处着手?谢谢
...全文
271 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shxng 2005-01-13
  • 打赏
  • 举报
回复
收藏中
mqjshanghai 2005-01-12
  • 打赏
  • 举报
回复
有些书上有你想要的例子以及代码

但是也只有几个我想要的代码,钱又那么贵所以我没买:(
想想不合算
weidegong 2005-01-11
  • 打赏
  • 举报
回复
帖子提前太频繁了!!!
weidegong 2005-01-10
  • 打赏
  • 举报
回复
能根据Process的Handle得到其可见窗体吗?

怎么列举系统可见Form,能根据Form.Handle得到进程的handle吗?

问的比较无耻…… 不过我看了些Delphi书,没有发现相关的内容:(
ly_liuyang 2005-01-07
  • 打赏
  • 举报
回复
呵呵,根本就不是使用Process的Handle!
需要的是Process的Form

你需要的是枚举系统当前可见的Form,用API获得Form所在的Thread后再来判定

http://lysoft.7u7.net
jackie168 2005-01-07
  • 打赏
  • 举报
回复
获取系统托盘的任意一个图标的句柄并隐藏

/// Code By Kingron, 2003
/// 获取系统托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了
function GetSysTrayIconRect(Text: string): TRect;
{
返回系统托盘中指定文字的图标的矩形区域。
例如返回音量控制图标的矩形区域:
GetSysTrayIconRect('音量');
}
begin
result := GetToolBarButtonRect(GetSysTrayWnd, Text);
end;



function GetSysTrayWnd: HWND;
{
返回系统托盘的句柄,适合于WinXP以上版本
}
begin
result := FindWindow('Shell_TrayWnd', nil);
result := FindWindowEx(result, 0, 'TrayNotifyWnd', nil);
result := FindWindowEx(result, 0, 'SysPager', nil);
result := FindWindowEx(result, 0, 'ToolbarWindow32', nil);
end;



function GetToolBarButtonRect(hWnd: HWND; Title: string): TRect;
{
返回指定工具栏对应的按钮指定文本的矩形区域
hWnd:工具栏句柄,Title:需要返回矩形区域的按钮文字
返回值:指定按钮的边界矩形,屏幕坐标
}
var
C, i: integer;
Inf _TBBUTTON;
Item: tagTCITEM;
Buff: PChar;
S: array[0..1024] of char;
PID: THandle;
PRC: THandle;
R: Cardinal;
begin
FillChar(result, SizeOf(result), 0);
if hWnd = 0 then Exit;
GetWindowThreadProcessId(hWnd, @PID);
PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);
Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);



if Format('%d.%d', [Win32MajorVersion, Win32MinorVersion]) >= '5.1' then {// Is Windows XP or Higher}
begin
C := SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
for i := 0 to C - 1 do
begin
FillChar(Info, SizeOf(Info), 0);
WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);



SendMessage(hWnd, TB_GETBUTTON, i, integer(Buff));
ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);



SendMessage(hWnd, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));
ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);
if SameText(StrPas(S), Title) and not Boolean(SendMessage(hWnd, TB_ISBUTTONHIDDEN, Info.idCommand, 0)) then
begin
SendMessage(hWnd, TB_GETRECT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));
ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @result, SizeOf(result), R);



Windows.ClientToScreen(hWnd, result.TopLeft);
Windows.ClientToScreen(hWnd, result.BottomRight);



Break;
end;
end;
end
else
begin
C := SendMessage(hWnd, TCM_GETITEMCOUNT, 0, 0);
for i := 0 to C - 1 do
begin
with Item do
begin
mask := TCIF_TEXT;
dwState := 0;
dwStateMask := 0;
cchTextMax := 2048;
pszText := PChar(integer(Buff) + SizeOf(Item) * 4);
iImage := 0;
lParam := 0;
end;
WriteProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);
SendMessage(hWnd, TCM_GETITEM, i, Integer(Buff));



ReadProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);
ReadProcessMemory(PRC, PChar(integer(Buff) + SizeOf(Item) * 4), @S[0], SizeOf(S), R);



if SameText(S, Title) then
begin
SendMessage(hWnd, TCM_GETITEMRECT, i, integer(Buff));
ReadProcessMemory(PRC, Buff, @result, SizeOf(result), R);



Windows.ClientToScreen(hWnd, result.TopLeft);
Windows.ClientToScreen(hWnd, result.BottomRight);
Break;
end;
end;
end;



VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
CloseHandle(PRC);
end;
juny0302 2005-01-07
  • 打赏
  • 举报
回复
别人的代码,参考一下:
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI;

const
WM_BARICON=WM_USER+200;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
procedure WMBarIcon(var Message:TMessage);message WM_BARICON;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.WMSysCommand
(var Message:TMessage);
var
lpData:PNotifyIconData;
begin
if Message.WParam = SC_ICON then
begin
//如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
Form1.Visible := False;
end
else
begin
//如果是其它的SystemCommand消息则调用系统缺省处理函数处理之。
DefWindowProc(Form1.Handle,Message.Msg,Message.WParam,Message.LParam);
end;
//
end;

procedure TForm1.WMBarIcon(var Message:TMessage);
var
lpData:PNotifyIconData;
begin
if (Message.LParam = WM_LBUTTONDOWN) then
begin
//如果用户点击任务栏图标则将图标删除并回复窗口。
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData);
Form1.Visible := True;
end;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin

end;

end.
weidegong 2005-01-07
  • 打赏
  • 举报
回复
function FindProc(ProcName: string): boolean;
var
OK: Bool;
hPL, hML: THandle;
processHandle:THandle;
ProcessStruct: TProcessEntry32;
ModuleStruct: TModuleEntry32;
begin
Result := False;
hPL := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
ProcessStruct.dwSize := SizeOf(TProcessEntry32);
OK := Process32First(hPL, ProcessStruct);
while OK do
begin
if compareText(ProcessStruct.szExeFile,ProcName)=0 then
begin
Result := True;
// find path info
hML := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessStruct.th32ProcessID);
ModuleStruct.dwSize := SizeOf(TModuleEntry32);
Module32First(hML, ModuleStruct);
if hML > 0 then
begin
Writeln(ModuleStruct.szExePath);
end;
CloseHandle(hML);

processHandle:=openProcess(PROCESS_ALL_ACCESS,true,ProcessStruct.th32ProcessID);
//怎么实现隐藏?好像隐藏不了:比如传入参数Notepad.exe,无法隐藏
//另外,如何监控使得新的Notepad程序也不显示?
//怎么显示出来,ShowWindow(processHandle,SW_Show)?
ShowWindow(processHandle,SW_Hide); //?
SetWindowLong(processHandle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
{
if TerminateProcess(processHandle,0) then writeln('Terminate '+ModuleStruct.szExePath+' OK!')
else writeln('Terminate '+ModuleStruct.szExePath+' fail...');
}
end;
OK := Process32Next(hPL, ProcessStruct);
end;
CloseHandle(hPL);
end;
ly_liuyang 2005-01-07
  • 打赏
  • 举报
回复
你的所谓隐藏指定条件的进程程序,是指不显示Form,用ShowWindow就能搞定
TrayIcon的,就上面那样,都是SendMessage的

http://lysoft.7u7.net
constantine 2005-01-07
  • 打赏
  • 举报
回复
>>>可以控制系统托盘的图标隐藏和重现

托盘区的一排图标其实是一个ToolBar,那么取得这个ToolBar的句柄然后发送相应的消息就可以控制其ToolButton的显示了。

//---------------------------------------------------------------------------
// 隐藏托盘区图标函数,nIndex为图标索引,bShow若为true表示显示,否则隐藏
void __fastcall ShowTrayIcon(int nIndex, bool bShow)
{
HANDLE hShellTray = FindWindow("Shell_TrayWnd", NULL);
if(hShellTray == NULL )
return;
HANDLE hTrayNotify = FindWindowEx(hShellTray, NULL, "TrayNotifyWnd", NULL);
if(hTrayNotify == NULL)
return;
HANDLE hToolBar = FindWindowEx(hTrayNotify, NULL, "ToolbarWindow32", NULL);
if(hToolBar)
{
SendMessage(hToolBar, TB_HIDEBUTTON, nIndex, !bShow);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 隐藏托盘区第2个图标
ShowTrayIcon(1, false);
}

bcb的,你参考一下

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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