做一個自己的工作列 (轉)
用該可以做一個自己的工作列,包括列舉出工作列上程式的Handle、WindowName、程式路徑、圖示。可選定視窗並提前,或者在程式間切換。
如果你的程式是滿屏的,並且遮蔽了鍵的話,或許可以用到下面的技巧。
********************* AppTabP.dpr
program AppTabP;
uses
Forms,
AppTab_f in 'AppTab_f.pas' {AppTab};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TAppTab, AppTab);
Application.Run;
end.
************************ AppTab_f.pas
unit AppTab_f;
interface
uses
, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TLHelp32,Buttons,, ExtCtrls, ImgList;
type
TAppTab = class(TForm)
ListBox1: TListBox;
BitBtn1: TBitBtn;
CaptionListBox: TListBox;
PathListBox: TListBox;
HwndListBox: TListBox;
Label1: TLabel;
tempImageList: TImageList;
tempImage: TImage;
procedure BitBtn1Click(Sender: T);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
AppList:TStrings;
AppName_Btn:Array[0..20] of TBitBtn;
procedure AppName_BtnClickHandle(Sender:TObject);
public
{ Public declarations }
end;
var
AppTab: TAppTab;
到視窗WindowName
function GetText(Wnd:HWND):string;
歷視窗
function EnumWindowsProc(Wnd:HWND;LParam:LPARAM):BOOL;stdcall;
程式Handle得到程式名(含路徑)
function WndToProc(hwnd:HWND):String;
得外部程式的圖示,是目錄就取夾圖示
function GetFileIcon(const Filename:String;SmallIcon:Boolean):HICON;
implementation
{$R *.dfm}
function GetText(Wnd:HWND):string;
var TextLength:Integer;
Text:PChar;
begin
TextLength:=SendMessage(Wnd,WM_GETTEXTLENGTH,0,0);
if TextLength=0 then Result:=''
else
begin
GetMem(Text,TextLength+1);
SendMessage(Wnd,WM_GETTEXT,TextLength+1,Integer(Text));
Result:=Text;
FreeMem(Text);
end;
end;
function EnumWindowsProc (Wnd: HWND; LParam: LPARAM): BOOL; stdcall;
begin
Result := True;
if (IsWindowVisible(Wnd) or IsIconic(wnd)) and
((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
(GetWindowLong(Wnd, GWL_HWNDPARENT) = GetDesktopWindow)) and
(GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then
begin
if Wnd<>Application.Handle then
begin
AppTab.Listbox1.items.add(Inttostr(Wnd)+'*****'+GetText(Wnd)+'*****'+WndToProc(Wnd));
AppTab.HwndListBox.items.add(Inttostr(Wnd));
AppTab.CaptionListBox.items.add(GetText(Wnd));
AppTab.PathListBox.Items.Add(WndToProc(Wnd));
//下把圖示加到ImageList中,為了動態生成按紐時使用
if Copy(WndToProc(Wnd),Length(WndToProc(Wnd))-12,13)='EXPLORER.EXE' then
AppTab.tempImage.Picture.Icon.Handle:=ExtractIcon(//
HINSTANCE,PChar(GetEnvironmentVariable('windir')+'systemShell32.dll'),3)
else AppTab.tempImage.Picture.Icon.Handle:=ExtractIcon(hInstance,PChar(WndToProc(Wnd)),0);
AppTab.tempImageList.AddIcon(AppTab.tempImage.Picture.Icon);
end;
end;
end;
procedure TAppTab.BitBtn1Click(Sender: TObject);
var AppNum:Integer;
begin
for AppNum:=0 to ListBox1.Items.Count-1 do
begin
AppName_Btn[AppNum]:=TBitBtn.Create(Self);
AppName_Btn[AppNum].Hint:=CaptionListBox.Items[AppNum];
AppName_Btn[AppNum].Caption:=Copy(CaptionListBox.Items[AppNum],1,8);
AppName_Btn[AppNum].Parent:=Self;
AppName_Btn[AppNum].Left:=82*AppNum;
AppName_Btn[AppNum].Width:=80;
AppName_Btn[AppNum].ShowHint:=True;
AppName_Btn[AppNum].Layout:=blGlyphLeft;
AppName_Btn[AppNum].OnClick:=AppName_BtnClickHandle;
AppName_BTN[AppNum].Tag:=StrToInt(HwndListBox.Items[AppNum]);//把Tag屬性使用起來,在SetForegroundWindow時可以直接用
按紐加圖示
tempImageList.GetBitmap(AppNum,AppName_Btn[AppNum].Glyph);
end;
end;
function WndToProc(hwnd:HWND):String;
var PID:D;
ok:Boolean;
ProceistHandle: THandle;//程式列表的控制程式碼
ProcessStruct:PROCESSENTRY32; 程的結構,程式的資訊都在這個結構裡
begin
Result:='';
GetWindowThreadProcessId(hwnd, PID);
ProcessListHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
ProcessStruct.dwSize:=Sizeof(ProcessStruct);
ok:=Process32First(ProcessListHandle,ProcessStruct);
while ok do
begin
if PID=ProcessStruct.th32ProcessID then Break;
ok:=Process32Next(ProcessListHandle,ProcessStruct);
end;
CloseHandle(ProcessListHandle);
Result:=ProcessStruct.szExeFile;
end;
procedure TAppTab.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
AppList.Free;
end;
procedure TAppTab.FormShow(Sender: TObject);
begin
ListBox1.Clear;
EnumWindows(@EnumWindowsProc,Sizeof(Integer));
end;
procedure TAppTab.FormCreate(Sender: TObject);
begin
AppList:=TStringList.Create;
end;
procedure TAppTab.AppName_BtnClickHandle(Sender:TObject);
begin
Tag使用起來,它不是廢物!!
ShowWindow(TBitBtn(Sender).Tag, SW_SHOW);
ShowWindow(TBitBtn(Sender).Tag, SW_RESTORE);
SetForegroundWindow(TBitBtn(Sender).Tag);
//面為什麼要用三句呢?奇怪啊
end;
function GetFileIcon(const Filename:String;SmallIcon:Boolean):HICON;
var info:TSHFILEINFO;
Flag:Integer;
begin
if SmallIcon then Flag:=(SHGFI_SMALLICON or SHGFI_ICON)
else Flag:=(SHGFI_LARGEICON or SHGFI_ICON);
SHGetFileInfo(Pchar(Filename),0,info,Sizeof(info),Flag);
Result:=info.hIcon;
end;
end.
****************************** AppTab_f.dfm
object AppTab: TAppTab
Left = 4
Top = 87
Width = 797
Height = 424
Caption = 'AppTab'
Color = clBtnFace
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = '宋體'
Font.Style = []
OldCreateOrder = False
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 24
Top = 216
Width = 521
Height = 13
Caption =
'Handle 程式路徑 Win' +
'dowName'
end
object tempImage: TImage
Left = 528
Top = 16
Width = 41
Height = 41
Visible = False
end
object BitBtn1: TBitBtn
Left = 0
Top = 52
Width = 137
Height = 25
Caption = '生成按紐'
TabOrder = 1
OnClick = BitBtn1Click
Glyph.Data = {
DE010000424DDE01000000000000760000002800000024000000120000000100
0400000000006801000000000000000000001000000000000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333336633
3333333333333FF3333333330000333333364463333333333333388F33333333
00003333333E66433333333333338F38F3333333000033333333E66333333333
33338FF8F3333333000033333333333333333333333338833333333300003333
3333446333333333333333FF3333333300003333333666433333333333333888
F333333300003333333E66433333333333338F38F333333300003333333E6664
3333333333338F38F3333333000033333333E6664333333333338F338F333333
0000333333333E6664333333333338F338F3333300003333344333E666433333
333F338F338F3333000033336664333E664333333388F338F338F33300003333
E66644466643333338F38FFF8338F333000033333E6666666663333338F33888
3338F3330000333333EE666666333333338FF33333383333000033333333EEEE
E333333333388FFFFF8333330000333333333333333333333333388888333333
0000}
NumGlyphs = 2
end
object CaptionListBox: TListBox
Left = 456
Top = 232
Width = 332
Height = 162
ItemHeight = 13
TabOrder = 2
end
object PathListBox: TListBox
Left = 104
Top = 232
Width = 345
Height = 163
ItemHeight = 13
TabOrder = 3
end
object ListBox1: TListBox
Left = 1
Top = 81
Width = 784
Height = 128
ItemHeight = 13
TabOrder = 0
end
object HwndListBox: TListBox
Left = 0
Top = 232
Width = 101
Height = 161
ItemHeight = 13
TabOrder = 4
end
object tempImageList: TImageList
Left = 496
Top = 24
end
end
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991958/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 教你快速做一個自己的“ChatGPT”ChatGPT
- windows10工作列一直轉圈怎麼辦 滑鼠一移到工作列就不停的轉Windows
- 自己動手做一個批次doc轉換為docx檔案的小工具
- 用commander做一個自己的eslint腳手架EsLint
- 做一個自己的WiFi密碼檢視器——AndroidWiFi密碼Android
- 分享自己寫的一個 Python 的 JSON 轉 Model 庫PythonJSON
- 自己動手實現一個阻塞佇列佇列
- 老弟想自己做個微信,被我一個問題勸退了。。
- 將一個Collection轉為陣列陣列
- 是時候擁有一個你自己的命令列工具了命令列
- 如何做個自己想要的Window Server了?Server
- 手把手教你做一個自己的chrome擴充套件程式Chrome套件
- [應用案例]一個基金管理工具,做來自己用的
- 如何在Github提交圖片,做一個自己的圖片倉庫Github
- 【自己的 Side Project】閃念 - 盡力為 iPhone 做一個 Idea PillsProjectiPhoneIdea
- 如何免費做一個屬於自己穩定有效的圖床圖床
- 使用css3做一個魔方旋轉的效果CSSS3
- js視訊轉字元畫 —— 寫一個屬於自己的字元轉換器JS字元
- 自己做一個ChatGPT微信小程式(程式碼開源)ChatGPT微信小程式
- 讓我們來做一個屬於自己的瀏覽器主頁吧!瀏覽器
- Python學習,給自己的程式碼做個合集,定製自己的桌面軟體!Python
- excel列轉行怎麼做 excel如何轉置行列Excel
- PgQueuer:一次一個佇列,構建更順暢的工作流程佇列
- 我最近覺得自己的收藏夾很亂,因為沒有事情做,就想閒著給自己做個網址導航的軟體【一】
- 手寫一個自己的PromisePromise
- 實現一個自己的mvvmMVVM
- 母嬰用品商家怎麼做自己一個微信小程式商城?微信小程式
- 《月圓之夜》製作人:小學時做自己的遊戲,如今在遊戲裡做一點自己遊戲
- 結合 Vuex 和 Pinia 做一個適合自己的狀態管理 nf-stateVue
- 開發一個自己的 CSS 框架(一)CSS框架
- 轉行做IT,你是怎麼找到第一份開發工作?
- 自己做一個table外掛 (一)Ajax獲取資料後動態生成table
- 分享自己做的一個指定程式以及執行緒長時間cpu監控的工具執行緒
- 自己寫一個ProviderIDE
- 自己造一個ReactDOMReact
- 分享一個自己做的小工具,百度收錄自動提交指令碼指令碼
- Drone CI For Github —— 打造自己的CI/CD工作流(一)Github
- 建立一個自己的 Linux系統Linux
- WPF中封裝一個自己的MessageBox封裝