VB:枚举托盘图标
kmlxk 发表于 2005-9-17 1:49:00
文件 Form1.frm 内容
VERSION 5.00 Begin VB.Form Form1 Caption = “Form1” ClientHeight = 3195 ClientLeft = 60 ClientTop = 345 ClientWidth = 4680 LinkTopic = “Form1” ScaleHeight = 3195 ScaleWidth = 4680 StartUpPosition = 3 ‘窗口缺省 Begin VB.CommandButton Command1 Caption = “Command1” Height = 375 Left = 2760 TabIndex = 1 Top = 2280 Width = 1455 End Begin VB.ListBox List1 Height = 1860 Left = 360 TabIndex = 0 Top = 240 Width = 3855 End End Attribute VB_Name = “Form1” Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit Private Declare Function OpenProcess Lib “KERNEL32” (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle Lib “KERNEL32” (ByVal hObject As Long) As Long Private Const READ_CONTROL As Long = &H20000; Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000; Private Const STANDARD_RIGHTS_READ As Long = (READ_CONTROL) Private Const STANDARD_RIGHTS_EXECUTE As Long = (READ_CONTROL) Private Const STANDARD_RIGHTS_ALL As Long = &H1F0000; Private Const STANDARD_RIGHTS_WRITE As Long = (READ_CONTROL) Private Const SYNCHRONIZE As Long = &H100000; Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF;) Private Const PROCESS_TERMINATE As Long = (&H1;) Private Declare Function GetWindowThreadProcessId Lib “user32.dll” (ByVal hwnd As Long, lpdwProcessId As Long) As Long Private Const WM_USER As Long = &H400; Private Declare Function FindWindow Lib “USER32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib “USER32” Alias “FindWindowExA” (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Const TB_BUTTONCOUNT As Long = (WM_USER + 24) Private Const TB_HIDEBUTTON As Long = (WM_USER + 4) Private Const TB_GETBUTTON As Long = (WM_USER + 23) Private Const TB_GETBITMAP As Long = (WM_USER + 44) Private Const TB_DELETEBUTTON As Long = (WM_USER + 22) Private Const TB_ADDBUTTONS As Long = (WM_USER + 20) Private Const TB_INSERTBUTTON As Long = (WM_USER + 21) Private Const TB_ISBUTTONHIDDEN As Long = (WM_USER + 12) Private Const ILD_NORMAL As Long = &H0; Private Declare Function SendMessage Lib “user32.dll” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function WriteProcessMemory Lib “kernel32.dll” (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long Private Declare Function ReadProcessMemory Lib “kernel32.dll” (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long Private Declare Function VirtualAllocEx Lib “kernel32.dll” (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long Private Declare Function VirtualFreeEx Lib “kernel32.dll” (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long Private Const PROCESS_VM_OPERATION As Long = (&H8;) Private Const PROCESS_VM_READ As Long = (&H10;) Private Const PROCESS_VM_WRITE As Long = (&H20;) Private Const MEM_RESERVE As Long = &H2000; Private Const MEM_COMMIT As Long = &H1000; Private Const MEM_RELEASE As Long = &H8000; Private Const PAGE_READWRITE As Long = &H4;
Private Sub Command1_Click() Dim lngTemp As Long Dim lngTray Dim lngPID As Long Dim lngPID2 As Long Dim hProcess As Long Dim lngProcess As Long Dim lngAddress As Long Dim lngCount As Long Dim lngButtons As Long Dim ret As Long Dim lngTextAdr As Long Dim lngHwndAdr As Long Dim lngButtonID As Long Dim hIcon As Long Dim lngHwnd As Long Dim lpFileName As String * 1024 Dim i As Long Dim strBuff(1024) As Byte Dim strText As String Dim lngTrayDC As Long lngTemp = FindWindow(“Shell_TrayWnd”, vbNullString) lngTemp = FindWindowEx(lngTemp, 0, “TrayNotifyWnd”, vbNullString) lngTemp = FindWindowEx(lngTemp, 0, “SysPager”, vbNullString) lngTray = FindWindowEx(lngTemp, 0, “ToolbarWindow32”, vbNullString) Debug.Print “lngTray=”; lngTray ret = GetWindowThreadProcessId(lngTray, lngPID) hProcess = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, lngPID) lngAddress = VirtualAllocEx(hProcess, ByVal 0&, ByVal 4096&, MEM_COMMIT, PAGE_READWRITE) lngButtons = SendMessage(lngTray, TB_BUTTONCOUNT, 0, 0)
For i = 0 To lngButtons - 1
ret = SendMessage(lngTray, TB_GETBUTTON, ByVal i, ByVal lngAddress)
ret = ReadProcessMemory(hProcess, ByVal lngAddress + 16, ByVal VarPtr(lngTextAdr), ByVal 4, ByVal 0&)
If lngTextAdr <> -1 Then
ret = ReadProcessMemory(hProcess, ByVal lngTextAdr, ByVal VarPtr(strBuff(0)), ByVal 1024, ByVal 0&)
ret = ReadProcessMemory(hProcess, ByVal lngAddress + 12, ByVal VarPtr(lngHwndAdr), ByVal 4, ByVal 0&)
ret = ReadProcessMemory(hProcess, ByVal lngHwndAdr, ByVal VarPtr(lngHwnd), ByVal 4, ByVal 0&)
ret = ReadProcessMemory(hProcess, ByVal lngAddress + 4, ByVal VarPtr(lngButtonID), ByVal 4, ByVal 0&)
strText = ConverNull(strBuff)
'lngHwnd 所属窗口handle
'strText 托盘图标文字
List1.AddItem lngHwnd & " - " & strText
End If
Next i
VirtualFreeEx hProcess, ByVal lngAddress, ByVal 4096&, MEM_RELEASE
CloseHandle hProcess
End Sub
Private Sub Form_Load() Command1.Caption = “&Enumerate;” End Sub
Function ConverNull(ByVal s As String) As String Dim nullpos As Long nullpos = InStr(s, Chr$(0)) If nullpos > 0 Then ConverNull = Left(s, nullpos - 1) Else ConverNull = s End If End Function
AlphaBlend 技术
现在许多游戏为了达到光影或图象的透明效果都会采用AlphaBlend 技术。所谓AlphaBlend技术,其实就是按照”Alpha”混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。在计算机中的图象可以用R(红色),G(绿色),B(蓝色)三原色来表示。假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,0为完全透明,1为完全不透明),Alpha混合公式如下:
R(C)=alpha*R(B)+(1-alpha)*R(A)
G(C)=alpha*G(B)+(1-alpha)*G(A)
B(C)=alpha*B(B)+(1-alpha)*B(A)
R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。
Alpha Blend的资料
用Photoshop做Mac风格的按钮
新建文档,RGB模式,白色背景。建立图层1,设置前景色为RGB(51,143,206)。然后选择圆角矩形工具,在工具选项中,设置绘图方式为填充像素,将矩形的圆角半径设为50像素,选择消除锯齿。点击几何选项,将矩形的大小设为91×27像素,在画布正中点击一下,即会出现一个蓝色的圆角矩形。
现在我们开始添加图层样式了。首先选择投影:将投影的不透明度降低为33%,取消全局光,角度为134度,距离和大小均为1像素,扩展为0,品质不变;
然后是内阴影样式:将内阴影的颜色设为RGB(0,56,113),不透明度为100%,取消全局光,角度为90度,距离为6像素,阻塞为15%,大小为16像素,品质保持不变,这样,按纽就具有了立体感。
接下来我们要制作光线从按纽中透出的感觉。选择内发光样式,将混合模式设为颜色减淡,不透明度为30%,颜色为白色,方法为较柔软,居中,阻塞为31%,大小为21像素,要特别注意等高线的形状,打开默认的等高线编辑器,将曲线设为图03的形状,选择消除锯齿,范围为31%;
下面是最关键的一步——添加强烈的反光效果。选择斜面和浮雕样式,将样式设为内斜面,方法为平滑,深度为81%,方向为上,大小为9像素,软化为1像素,阴影的角度为90度,高度为73度,高光和暗调的不透明度均为100%,暗调的模式为正常,颜色为RGB(4,126,188),这样高光效果就出来了。
但这样是不够的,我们希望高光效果更为贴切。选择等高线,注意是斜面等高线,而不是光泽等高线,将等高线类型选择为预设类型中的半圆,消除锯齿,范围为69%,这样就能得到逼真的反光效果。
- 为了使按钮看起来更好,我们添加一些简单的阴影效果。但我们的样式中已经采用了投影样式,所以要另外想办法。按住Ctrl键,载入按纽的不透明度区域,从编辑菜单中选择合并拷贝命令,在图层1之下新建一层,按Ctrl+V,将图像粘贴到新层中,取消选择。
合并拷贝命令可以复制选区内所有图层的图像,包括图层样式在内,这里,我们所用这个命令就是为了拼合图层样式的效果。此外,在粘贴前,如果没有取消选择,那么图像会粘贴入选区中,否则的话,图像会被自动粘贴到图层的正中。
对图层2使用高斯模糊,半径大概为5.5像素左右。再用移动工具将图层移动到按纽的右下方,作为透明阴影。
- 最后,在按纽上写上文字即可。如果你更喜欢淡灰色的透明按钮,这里有个简单的法子:打开通道面板,点击蓝色通道,仅显示这一个通道的图像,由于我们的按纽是蓝色调的,所以这个通道内的图像最能体现按纽的情况。如果你的按纽是红色调或是绿色调的,那么同样,分别选择红色通道和绿色通道,就能得到灰色的透明按钮了。
获取快捷方式的文件路径
#include
bool ReadShortcut(LPWSTR lpwLnkFile, LPSTR lpDescFile) { bool bReturn = true; IShellLink *pShellLink;
if(bReturn)
{
bReturn = (CoInitialize(NULL) == S_OK);
if(bReturn)
{
bReturn = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **)&pShellLink;) >= 0;
if(bReturn)
{
IPersistFile *ppf;
bReturn = pShellLink->QueryInterface(IID_IPersistFile, (void **)&ppf;) >= 0;
if(bReturn)
{
bReturn = ppf->Load(lpwLnkFile, TRUE) >= 0;
if(bReturn)
{
pShellLink->GetPath(lpDescFile, MAX_PATH, NULL, 0);
}
ppf->Release ();
}
pShellLink->Release ();
}
CoUninitialize();
}
}
return bReturn;
}
// 测试代码: char szBuf[MAX_PATH]; ReadShortcut(L”C:\GLWorld.lnk”, szBuf); MessageBox(0, szBuf, “”, 0);
利用windows提供的advapi32.dll进行MD5加密
#include
/* Data structure for MD5 (Message-Digest) computation / typedef struct { ULONG i[2]; / number of bits handled mod 2^64 / ULONG buf[4]; / scratch buffer / unsigned char in[64]; / input buffer / unsigned char digest[16]; / actual digest after MD5Final call */ } MD5_CTX;
#define MD5DIGESTLEN 16
#define PROTO_LIST(list) list
/*
- MTS: Each of these assumes MD5_CTX is locked against simultaneous use. / typedef void (WINAPI PMD5Init) PROTO_LIST ((MD5_CTX )); typedef void (WINAPI PMD5Update) PROTO_LIST ((MD5_CTX *, const unsigned char , unsigned int)); typedef void (WINAPI PMD5Final )PROTO_LIST ((MD5_CTX *));
PMD5Init MD5Init = NULL; PMD5Update MD5Update = NULL; PMD5Final MD5Final = NULL;
const char *Hex2ASC(const BYTE *Hex, int Len) { static char ASC[4096 * 2]; int i;
for (i = 0; i < Len; i++)
{
ASC[i * 2] = "0123456789ABCDEF"[Hex[i] >> 4];
ASC[i * 2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
}
ASC[i * 2] = '\0';
return ASC;
}
int main() { MD5_CTX ctx; unsigned char buf[10] = “Xiaozhou”; HINSTANCE hDLL;
if ( (hDLL = LoadLibrary("advapi32.dll")) > 0 )
{
MD5Init = (PMD5Init)GetProcAddress(hDLL,"MD5Init");
MD5Update = (PMD5Update)GetProcAddress(hDLL,"MD5Update");
MD5Final = (PMD5Final)GetProcAddress(hDLL,"MD5Final");
MD5Init(&ctx;);
MD5Update(&ctx;,buf,8);
MD5Final(&ctx;);
printf("%s \n",Hex2ASC(ctx.digest,16));
}
return 0;
}
关于Resize的话题
今天在codeproject上面找了些关于Resize的时候,控件自动布局的话题。
把地址贴在这里,作个记号。
http://www.codeproject.com/dialog/RPResizeDlg.asp http://www.codeproject.com/useritems/SizingDialog.asp http://www.codeproject.com/dialog/easysize.asp http://www.codeproject.com/dialog/dlgresizearticle.asp http://www.codeproject.com/dialog/resizectrl.asp http://www.codeproject.com/docking/AutoResizingControls.asp http://www.codeproject.com/dialog/formview2.asp
MSXML读写的例子
1、目标文档:
lizlex
XML Developer's Guide
2、步骤:
(1)在StdAfx.h中引入动态链接库 MSXML.DLL(C:\windows\system32\msxml4.dll) #import
(2)界面设计: 分别放入三个Text,用于输入数据,与显示文档内容用,并添加关联的成员变量m_strId,m_strAuthor, m_strTitle;并添加确定按钮:
(3)产生文档的程序片断 void CXmlparseDlg::OnButtonGenerate() { UpdateData();
MSXML2::IXMLDOMDocumentPtr pDoc; MSXML2::IXMLDOMElementPtr xmlRoot ;
//创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if(!SUCCEEDED(hr)) { MessageBox(“无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!”); return ; }
//根节点的名称为Book //创建元素并添加到文档中 xmlRoot=pDoc->createElement((_bstr_t)”Book”);
//设置属性 xmlRoot->setAttribute(“id”,(const char *)m_strId); pDoc->appendChild(xmlRoot); MSXML2::IXMLDOMElementPtr pNode;
//添加“author”元素 pNode=pDoc->createElement((_bstr_t)”Author”); pNode->Puttext((_bstr_t)(const char *)m_strAuthor); xmlRoot->appendChild(pNode);
//添加“Title”元素 pNode=pDoc->createElement(“Title”); pNode->Puttext((const char *)m_strTitle); xmlRoot->appendChild(pNode);
//保存到文件 //如果不存在就建立,存在就覆盖 pDoc->save(“d:\he.xml”);
}
(4)读取XML文档的程序片断 void CXmlparseDlg::OnButtonLoad() { MSXML2::IXMLDOMDocumentPtr pDoc; HRESULT hr; hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if(FAILED(hr)) { MessageBox(“无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!”); return ; }
//加载文件 pDoc->load(“d:\he.xml”);
MSXML2::IXMLDOMNodePtr pNode;
//在树中查找名为Book的节点,”//“表示在任意一层查找 pNode=pDoc->selectSingleNode(“//Book”);
MSXML2::DOMNodeType nodeType;
//得到节点类型 pNode->get_nodeType(&nodeType;);
//节点名称 CString strName;
strName=(char *)pNode->GetnodeName();
//节点属性,放在链表中 MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL; MSXML2::IXMLDOMNodePtr pAttrItem; _variant_t variantvalue; pNode->get_attributes(&pAttrMap;);
long count; count=pAttrMap->get_length(&count;);
pAttrMap->get_item(0,&pAttrItem;); //取得节点的值 pAttrItem->get_nodeTypedvalue(&variantvalue;); m_strId=(char *)(_bstr_t)variantvalue;
UpdateData(FALSE);
}
BLOG更新
前段时间,有人在主站的留言本上发广告连接,后来我修改了留言本的代码,屏蔽了链接内容。广告也少了。可是好景不长,发广告的人,又把目标转向了我的BLOG。。。。。我最气愤那些发广告的人,收了别人的钱,专门为别人加广告链接,为的是提高雇主的Google Page Rank。本来与我不相干的,可是你这样赚钱也太没良心了把。利己,但是却损了人。更可恶的是,让搜索引擎充满了垃圾。大大降低搜索效率。对此,对那些赚昧心钱的人,表示强烈的鄙视!!![lol]
垃圾广告的战火已经波及到我的BLOG。我决不姑息。今天又改了BLOG评论的ASP代码(虽然我ASP很久没用了。有点生疏,但是……天才总是什么一学就会的。哈哈)。BLOG屏蔽了广告链接的一些关键字。现在是凌晨1点多。(都是你们这些发垃圾广告的害的!![twisted])
本站宣言:抵抗垃圾广告到底,绝不姑息!!
VC中用Flash Control播放FLASH
project-》add to project-》components and controls
选择插入Shockwave Flash Object 控件。
工程中插入一个CShockwaveFlash类
然后,就可以定义一个CShockwaveFlash类的实例 CShockwaveFlash m_flash; m_flash.Create(NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,200,200),this,2000); m_flash.LoadMovie(“swf文件绝对路径”); m_flash.Play();
I like shopping
在MS的ecompany shop买了一堆东西。期待我的蓝牙套件。以下是购物清单:
Original Line Items Your 6 original line items are: Item # Description Qty Status Price - MIC23019600 GrandPaws Brown Plush Bear 1 Shipped $14.99 - MIC12014000 MSN Tumbler Orange 1 Shipped $6.99 - MIC29041800 OpticalDsktp Elite Bluetooth 1 Shipped $100.00 - MIC12016700 Revolutions Blue Tumbler 1 Shipped $14.99 - MIC12012700 Stainless Steel Blue Tumbler 1 Shipped $6.99 - MIC12009900 Xbox Plastic Insulated Tumbler 1 Shipped $6.00
Subtotal: $149.96