au3fan 发表于 2012-3-27 21:00:26

api取图标句柄 为什么我娶不到呢?求助高手

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)

lpxx 发表于 2012-3-27 21:35:38

娶不到?
这个没人能帮到你

Qokelate 发表于 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

netegg 发表于 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;
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下的画笔,应该用访问注册表的方法获得其路径,要
作成一个
比较考究的程序,考虑应该全面点.

netegg 发表于 2012-3-28 08:48:08

本帖最后由 netegg 于 2012-3-28 08:49 编辑

回复 9# 专业的门外汉笨

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

你要是真觉得自己的学问到家了,逐句改成能运行的auto来倒是真的

netegg 发表于 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)

netegg 发表于 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;wchar TypeName;'
要放字符串,也要放到结构里,不能直接用到这个api里

3mile 发表于 2012-3-28 09:33:57

用那么多马甲号干什么?
提问题又不丢人.
Local $tSHFILEINFO = DllStructCreate("ptr hIcon; int iIcon; dword dwAttributes; wchar szDisplayName; wchar szTypeName")
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)

netegg 发表于 2012-3-28 09:36:24

用那么多马甲号干什么?
提问题又不丢人.
3mile 发表于 2012-3-28 09:33 http://www.autoitx.com/images/common/back.gif
:face (24):三笑惊了

happytc 发表于 2012-3-28 10:25:46

用那么多马甲号干什么?
提问题又不丢人.
3mile 发表于 2012-3-28 09:33 http://www.autoitx.com/images/common/back.gif

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

笑……%
是不是我也来注册个马甲穿穿呀
页: [1]
查看完整版本: api取图标句柄 为什么我娶不到呢?求助高手