找回密码
 加入
搜索
查看: 4576|回复: 14

[系统综合] api取图标句柄 为什么我娶不到呢?求助高手

  [复制链接]
发表于 2012-3-27 21:00:26 | 显示全部楼层 |阅读模式
api取图标句柄  为什么我娶不到呢?求助高手

问题见标题↑


代码如下


#Include <WinAPIEx.au3>
$sPath="F:\autoit3\AutoIt3Help.exe"

$sInfo="";none

$tSHFILEINFO = DllStructCreate($tagSHFILEINFO)
MsgBox("","",$tSHFILEINFO)
$ss = DllCall('shell32.dll', 'dword_ptr', 'SHGetFileInfoW', 'wstr', $sPath, 'dword',128, 'ptr', $sInfo, 'uint', 384, 'uint', 256)
MsgBox("","",$ss)
$df=$sInfo.hIcon
MsgBox("","",$df)


求助
#Include <WinAPIEx.au3>
$sPath="F:\autoit3\AutoIt3Help.exe"

$sInfo="";none

$tSHFILEINFO = DllStructCreate($tagSHFILEINFO)
MsgBox("","",$tSHFILEINFO)
$ss = DllCall('shell32.dll', 'dword_ptr', 'SHGetFileInfoW', 'wstr', $sPath, 'dword',128, 'ptr', $sInfo, 'uint', 384, 'uint', 256)
MsgBox("","",$ss)
$df=$sInfo.hIcon
MsgBox("","",$df)
发表于 2012-3-27 21:35:38 | 显示全部楼层
娶不到?
这个没人能帮到你
发表于 2012-3-27 21:38:11 | 显示全部楼层
人家不肯嫁  那也没办法

发API原型上来看看,没用过  帮顶
发表于 2012-3-27 21:59:44 | 显示全部楼层
.版本 2

.DLL命令 SHGetFileInfo, 整数型, , "SHGetFileInfo", 公开
    .参数 pszPath, 文本型
    .参数 dwFileAttributes, 整数型
    .参数 psfi, SHFILEINFO
    .参数 cbFileInfo, 整数型
    .参数 uFlags, 整数型
.版本 2

.子程序 _按钮2_被单击
.局部变量 图标句柄, 整数型
.局部变量 sInfo, SHFILEINFO

.如果真 (通用对话框1.打开 ())
    SHGetFileInfo (通用对话框1.文件名, 128, sInfo, 348, 256)
    图标句柄 = sInfo.hIcon
    图标句柄编辑框.内容 = 到文本 (图标句柄)
.如果真结束
.版本 2

.数据类型 SHFILEINFO, 公开
    .成员 hIcon
    .成员 iIcon
    .成员 dwAttributes
    .成员 szDisplayName, 字节型, , "256"
    .成员 szTypeName, 字节型, , "80"
原型如上
发表于 2012-3-27 22:00:49 | 显示全部楼层
~~忘换马甲了。。。。。
发表于 2012-3-27 22:32:06 | 显示全部楼层
DWORD   WINAPI   SHGetFileInfo(
        LPCTSTR   pszPath,   
        DWORD   dwFileAttributes,   
        SHFILEINFO   FAR   *psfi,   
        UINT   cbFileInfo,   
        UINT   uFlags
在uFlages指定SHGFI_SYSICONINDEX     or        SHGFI_LARGEICON
发表于 2012-3-28 02:43:52 | 显示全部楼层
回复 6# 专业的门外汉笨
写的这个和autoit有关系吗
发表于 2012-3-28 07:45:05 | 显示全部楼层
/********************************************************************
  created:  2008/05/02
  created:  2:5:2008   3:40
            main.cpp
  author:    Gohan
  purpose:  演示SHBrowseForFolder用法
            演示SHGetFileInfo获取路径图标   
            演示Picture Box在SDK里的使用方法
*********************************************************************/
#include <Windows.h>
#include <ShlObj.h>
#include "resource.h"
HICON g_icon;
RECT g_rect;
TCHAR g_path[MAX_PATH];
void OnInitDlg(HWND hwnd)
{
    GetWindowRect(GetDlgItem(hwnd, IDC_ICON1), &g_rect);
    MapWindowPoints(NULL, hwnd, (LPPOINT) &g_rect, 2);
    DestroyWindow(GetDlgItem(hwnd, IDC_ICON1));
    SetDlgItemText(hwnd,IDC_PATH,g_path);
}
void OnPaint(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    DrawIcon(hdc,g_rect.left,g_rect.left,g_icon);
    EndPaint(hwnd,&ps);
}
BOOL CALLBACK DlgProc (HWND hDlg, UINT message,
                            WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG :
        OnInitDlg(hDlg);
        return TRUE ;
    case WM_PAINT:
        OnPaint(hDlg);
        return TRUE;
    case WM_COMMAND :
        switch (LOWORD (wParam))
        {
        case IDOK :
        case IDCANCEL :
            EndDialog (hDlg, 0) ;
            return TRUE ;
        }
        break ;
    }
    return FALSE ;
}
int main()
{
    HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
    BROWSEINFO bi;
    ZeroMemory(&bi,sizeof(BROWSEINFO));
    LPMALLOC pMalloc;
    LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
   
    if(pidl != NULL)
    {
        SHGetPathFromIDList(pidl,g_path);
        SHFILEINFO sfi;
        ZeroMemory(&sfi,sizeof(SHFILEINFO));
        SHGetFileInfo(g_path,0,&sfi,sizeof(SHFILEINFO),SHGFI_ICON);
        g_icon = sfi.hIcon;
        DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, DlgProc) ;
        //MessageBox(NULL,path,TEXT("Choose"),MB_OK);
        if(SUCCEEDED(SHGetMalloc(&pMalloc)))
        {
            pMalloc->Free(pidl);
            pMalloc->Release();
        }
    }
    else
    {
        MessageBox(NULL,TEXT("),TEXT("Choose"),MB_OK);
    }
}
/************************************************************************/
/* resource.h                                                           */
/************************************************************************/
#define IDD_DIALOG1                     101
#define IDC_PATH                        1001
#define IDC_ICON1                       1002
/************************************************************************/
/* demo.rc Microsoft Visual C++ generated resource script.              */
/************************************************************************/
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 126, 83
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,69,7,50,14
    PUSHBUTTON      "取消",IDCANCEL,69,24,50,14
    CONTROL         "",IDC_ICON1,"Static",SS_WHITEFRAME | SS_REALSIZEIMAGE,13,10,20,20,WS_EX_TRANSPARENT
    LTEXT           "静态",IDC_PATH,14,44,89,21,0,WS_EX_CLIENTEDGE
END
发表于 2012-3-28 08:03:23 | 显示全部楼层
可采取两种方法:   
              (1)   SDK函数SHGetFileInfo或使用ExtractIcon获得图标资源的
              handle,   
              (2)   SDK函数SHGetFileInfo获得有关文件的很多信息,如大小图标,属
  性,   
  类型等.   
              Example(1):在程序窗口左上角显示NotePad图标.   

              void   CSampleView:   OnDraw(CDC   *   pDC)   
              {   
              if(   ::   SHGetFileInfo(_T( "c:\\pwin95\\notepad.exe "),0,   
              &stFileInfo,sizeof(stFileInfo),SHGFI_ICON))   
              {   
              pDC   -> DrawIcon(10,10,stFileInfo.hIcon);   
              }   
              }   
              Example(2):同样功能,Use   ExtractIcon   Function   

              void   CSampleView::   OnDraw(CDC   *pDC)   
              {   
              HICON   hIcon=::   ExtractIcon(AfxGetInstanceHandle(),_T   
              ( "NotePad.exe "),0);   

              if   (hIcon   &&hIcon!=(HICON)-1)   
              pDC-> DrawIcon(10,10,hIcon);   
              }   
  说明:获得notepad.exe的路径正规上来说用GetWindowsDirectory函数
  得到,   
  如果是调用win95下的画笔,应该用访问注册表的方法获得其路径,要
  作成一个
  比较考究的程序,考虑应该全面点.
发表于 2012-3-28 08:48:08 | 显示全部楼层
本帖最后由 netegg 于 2012-3-28 08:49 编辑

回复 9# 专业的门外汉笨

你真有点过了,想学c的话,何必到这里来

你要是真觉得自己的学问到家了,逐句改成能运行的auto来倒是真的
发表于 2012-3-28 09:23:26 | 显示全部楼层
本帖最后由 netegg 于 2012-3-28 09:27 编辑

回复 1# au3fan
$sPath=@ProgramFilesDir & "\autoit3\AutoIt3Help.exe"
$tSHFILEINFO = DllStructCreate($tagSHFILEINFO)
$ss = _WinAPI_ShellGetFileInfo( $sPath, $SHGFI_ICON, $FILE_ATTRIBUTE_NORMAL, $tSHFILEINFO)
if $ss then $df = DllStructGetData($tSHFILEINFO, 'hIcon')
MsgBox("","",$df)

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2012-3-28 09:30:56 | 显示全部楼层
本帖最后由 netegg 于 2012-3-28 09:34 编辑

'ptr', $sInfo
楼主注意下,这个参数指明是要指针,你摆个字符串上去干什么
Global Const $tagSHFILEINFO = 'ptr hIcon;int iIcon;dword Attributes;wchar DisplayName[260];wchar TypeName[80];'
要放字符串,也要放到结构里,不能直接用到这个api里
发表于 2012-3-28 09:33:57 | 显示全部楼层
用那么多马甲号干什么?
提问题又不丢人.
Local $tSHFILEINFO = DllStructCreate("ptr hIcon; int iIcon; dword dwAttributes; wchar szDisplayName[260]; wchar szTypeName[80]")
Local $Ret = DllCall('shell32.dll', 'ptr', 'SHGetFileInfoW', 'wstr', $sPath, 'dword', 0x80, 'ptr', DllStructGetPtr($tSHFILEINFO), 'int', DllStructGetSize($tSHFILEINFO), 'int', 0x100)
Local $hicon = DllStructGetData($tSHFILEINFO, 'hIcon')
MsgBox(0,0,$hicon)

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2012-3-28 09:36:24 | 显示全部楼层
用那么多马甲号干什么?
提问题又不丢人.
3mile 发表于 2012-3-28 09:33

三笑惊了

评分

参与人数 1金钱 +10 收起 理由
3mile + 10 呵呵

查看全部评分

发表于 2012-3-28 10:25:46 | 显示全部楼层
用那么多马甲号干什么?
提问题又不丢人.
3mile 发表于 2012-3-28 09:33


楼主是怕万一一时脑子短路,提了一个小白问题

笑……%
是不是我也来注册个马甲穿穿呀
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-18 14:56 , Processed in 0.084738 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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