Win32 API 日本語リファレンス
ホームUI.Shell › SHAutoComplete

SHAutoComplete

関数
編集コントロールにオートコンプリート機能を設定する。
DLLSHLWAPI.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// SHLWAPI.dll
#include <windows.h>

HRESULT SHAutoComplete(
    HWND hwndEdit,
    SHELL_AUTOCOMPLETE_FLAGS dwFlags
);

パラメーター

名前方向説明
hwndEditHWNDinシステムのエディットコントロールのウィンドウハンドル。通常、このパラメーターはエディットコントロール、または ComboBoxEx コントロールに埋め込まれたエディットコントロールのハンドルです。
dwFlagsSHELL_AUTOCOMPLETE_FLAGSin

SHAutoComplete の動作を制御するフラグです。最初の 4 つのフラグは、Internet Explorer のレジストリ設定を上書きするために使用します。ユーザーは、ツール メニューから インターネット オプション プロパティシートを起動し、詳細設定 タブをクリックすることで、これらの設定を手動で変更できます。

SHACF_AUTOAPPEND_FORCE_OFF (0x80000000)

レジストリの既定値を無視し、AutoAppend 機能を強制的にオフにします。このフラグは、SHACF_FILESYS* または SHACF_URL* フラグの 1 つ以上と組み合わせて使用する必要があります。

SHACF_AUTOAPPEND_FORCE_ON (0x40000000)

レジストリの値を無視し、AutoAppend 機能を強制的にオンにします。補完された文字列が、追加された文字を強調表示した状態でエディットボックスに表示されます。このフラグは、SHACF_FILESYS* または SHACF_URL* フラグの 1 つ以上と組み合わせて使用する必要があります。

SHACF_AUTOSUGGEST_FORCE_OFF (0x20000000)

レジストリの既定値を無視し、AutoSuggest 機能を強制的にオフにします。このフラグは、SHACF_FILESYS* または SHACF_URL* フラグの 1 つ以上と組み合わせて使用する必要があります。

SHACF_AUTOSUGGEST_FORCE_ON (0x10000000)

レジストリの値を無視し、AutoSuggest 機能を強制的にオンにします。補完候補となる文字列の一覧が、エディットボックスの下にドロップダウンリストとして表示されます。このフラグは、SHACF_FILESYS* または SHACF_URL* フラグの 1 つ以上と組み合わせて使用する必要があります。

SHACF_DEFAULT (0x00000000)

既定の設定で、SHACF_FILESYSTEM | SHACF_URLALL と同等です。SHACF_DEFAULT は他のフラグと組み合わせることはできません。

SHACF_FILESYS_ONLY (0x00000010)

ファイルシステムのみを含めます。

SHACF_FILESYS_DIRS (0x00000020)

ファイルシステムと、ディレクトリ、UNC サーバー、UNC サーバー共有を含めます。

SHACF_FILESYSTEM (0x00000001)

ファイルシステムと、その他のシェル(デスクトップ、コンピューター、コントロール パネルなど)を含めます。

SHACF_URLALL (SHACF_URLHISTORY | SHACF_URLMRU)

ユーザーの 履歴 および 最近使用した項目 の一覧に含まれる URL を含めます。SHACF_URLHISTORY | SHACF_URLMRU と同等です。

SHACF_URLHISTORY (0x00000002)

ユーザーの 履歴 の一覧に含まれる URL を含めます。

SHACF_URLMRU (0x00000004)

ユーザーの 最近使用した項目 の一覧に含まれる URL を含めます。

SHACF_USETAB (0x00000008)

TAB キーを押すことで、AutoSuggest の一覧から項目を選択できるようにします。このフラグが設定されていない場合、TAB キーを押すとフォーカスが次のコントロールに移り、AutoSuggest の一覧が閉じます。SHACF_USETAB が設定されている場合、TAB キーを押すと一覧の最初の項目が選択されます。もう一度 TAB キーを押すと一覧の次の項目が選択され、以降も同様です。一覧の末尾に達した状態で次に TAB キーを押すと、フォーカスがエディットコントロールに戻ります。このフラグは、このページに記載されている SHACF_FILESYS* または SHACF_URL* フラグの 1 つ以上と組み合わせて使用する必要があります。

SHACF_VIRTUAL_NAMESPACE (0x00000040)

戻り値の型: HRESULT

公式ドキュメント

システムのエディットコントロールに対して、URL やファイルシステムのパスの補完を支援するために AutoComplete を使用するよう指示します。

戻り値

型: HRESULT

この関数が成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

SHAutoComplete は、エディットコントロールや、ComboBoxEx コントロールなどエディットコントロールを内包するコントロールを含む、あらゆるシステムのエディットコントロールで動作します。ComboBoxEx コントロールに埋め込まれたエディットコントロールのハンドルを取得するには、ComboBoxEx コントロールに CBEM_GETEDITCONTROL メッセージを送信します。

アプリケーションは、この関数を呼び出す前に CoInitialize または OleInitialize のいずれかを呼び出しておく必要があります。hwndEdit に対する WM_DESTROY メッセージの処理がエディットボックスで完了するまで、CoUninitialize または OleUninitialize を呼び出すことはできません。

AutoSuggest のドロップダウンリストボックスに表示できる項目の最大数は 1000 です。

Windows Vista より前のバージョンの Windows、および Windows Server 2008 より前のサーバーバージョンでは、同じ HWND に対して SHAutoComplete を複数回呼び出してはなりません。複数回呼び出すとメモリリークが発生します。これにより、以前の AutoComplete オブジェクトのインスタンス、その AutoComplete オブジェクトが参照していた列挙子オブジェクト、Windows グラフィックス デバイス インターフェイス(GDI)リソースなど、元のリソースが解放されなくなります。AutoComplete の一覧を変更するために異なるフラグのセットで SHAutoComplete を再度呼び出すのではなく、CLSID_AutoComplete を指定して CoCreateInstance を呼び出し、AutoComplete オブジェクトを取得してください。その後、HWND をそのオブジェクトに渡して初期化し、独自のカスタム列挙子を提供します。AutoComplete で複数の一覧を使用したい場合は、CLSID_ACLMulti を使用できます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// SHLWAPI.dll
#include <windows.h>

HRESULT SHAutoComplete(
    HWND hwndEdit,
    SHELL_AUTOCOMPLETE_FLAGS dwFlags
);
[DllImport("SHLWAPI.dll", ExactSpelling = true)]
static extern int SHAutoComplete(
    IntPtr hwndEdit,   // HWND
    uint dwFlags   // SHELL_AUTOCOMPLETE_FLAGS
);
<DllImport("SHLWAPI.dll", ExactSpelling:=True)>
Public Shared Function SHAutoComplete(
    hwndEdit As IntPtr,   ' HWND
    dwFlags As UInteger   ' SHELL_AUTOCOMPLETE_FLAGS
) As Integer
End Function
' hwndEdit : HWND
' dwFlags : SHELL_AUTOCOMPLETE_FLAGS
Declare PtrSafe Function SHAutoComplete Lib "shlwapi" ( _
    ByVal hwndEdit As LongPtr, _
    ByVal dwFlags As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SHAutoComplete = ctypes.windll.shlwapi.SHAutoComplete
SHAutoComplete.restype = ctypes.c_int
SHAutoComplete.argtypes = [
    wintypes.HANDLE,  # hwndEdit : HWND
    wintypes.DWORD,  # dwFlags : SHELL_AUTOCOMPLETE_FLAGS
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('SHLWAPI.dll')
SHAutoComplete = Fiddle::Function.new(
  lib['SHAutoComplete'],
  [
    Fiddle::TYPE_VOIDP,  # hwndEdit : HWND
    -Fiddle::TYPE_INT,  # dwFlags : SHELL_AUTOCOMPLETE_FLAGS
  ],
  Fiddle::TYPE_INT)
#[link(name = "shlwapi")]
extern "system" {
    fn SHAutoComplete(
        hwndEdit: *mut core::ffi::c_void,  // HWND
        dwFlags: u32  // SHELL_AUTOCOMPLETE_FLAGS
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("SHLWAPI.dll")]
public static extern int SHAutoComplete(IntPtr hwndEdit, uint dwFlags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'SHLWAPI_SHAutoComplete' -Namespace Win32 -PassThru
# $api::SHAutoComplete(hwndEdit, dwFlags)
#uselib "SHLWAPI.dll"
#func global SHAutoComplete "SHAutoComplete" sptr, sptr
; SHAutoComplete hwndEdit, dwFlags   ; 戻り値は stat
; hwndEdit : HWND -> "sptr"
; dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "SHLWAPI.dll"
#cfunc global SHAutoComplete "SHAutoComplete" sptr, int
; res = SHAutoComplete(hwndEdit, dwFlags)
; hwndEdit : HWND -> "sptr"
; dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> "int"
; HRESULT SHAutoComplete(HWND hwndEdit, SHELL_AUTOCOMPLETE_FLAGS dwFlags)
#uselib "SHLWAPI.dll"
#cfunc global SHAutoComplete "SHAutoComplete" intptr, int
; res = SHAutoComplete(hwndEdit, dwFlags)
; hwndEdit : HWND -> "intptr"
; dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	shlwapi = windows.NewLazySystemDLL("SHLWAPI.dll")
	procSHAutoComplete = shlwapi.NewProc("SHAutoComplete")
)

// hwndEdit (HWND), dwFlags (SHELL_AUTOCOMPLETE_FLAGS)
r1, _, err := procSHAutoComplete.Call(
	uintptr(hwndEdit),
	uintptr(dwFlags),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function SHAutoComplete(
  hwndEdit: THandle;   // HWND
  dwFlags: DWORD   // SHELL_AUTOCOMPLETE_FLAGS
): Integer; stdcall;
  external 'SHLWAPI.dll' name 'SHAutoComplete';
result := DllCall("SHLWAPI\SHAutoComplete"
    , "Ptr", hwndEdit   ; HWND
    , "UInt", dwFlags   ; SHELL_AUTOCOMPLETE_FLAGS
    , "Int")   ; return: HRESULT
●SHAutoComplete(hwndEdit, dwFlags) = DLL("SHLWAPI.dll", "int SHAutoComplete(void*, dword)")
# 呼び出し: SHAutoComplete(hwndEdit, dwFlags)
# hwndEdit : HWND -> "void*"
# dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "shlwapi" fn SHAutoComplete(
    hwndEdit: ?*anyopaque, // HWND
    dwFlags: u32 // SHELL_AUTOCOMPLETE_FLAGS
) callconv(std.os.windows.WINAPI) i32;
proc SHAutoComplete(
    hwndEdit: pointer,  # HWND
    dwFlags: uint32  # SHELL_AUTOCOMPLETE_FLAGS
): int32 {.importc: "SHAutoComplete", stdcall, dynlib: "SHLWAPI.dll".}
pragma(lib, "shlwapi");
extern(Windows)
int SHAutoComplete(
    void* hwndEdit,   // HWND
    uint dwFlags   // SHELL_AUTOCOMPLETE_FLAGS
);
ccall((:SHAutoComplete, "SHLWAPI.dll"), stdcall, Int32,
      (Ptr{Cvoid}, UInt32),
      hwndEdit, dwFlags)
# hwndEdit : HWND -> Ptr{Cvoid}
# dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t SHAutoComplete(
    void* hwndEdit,
    uint32_t dwFlags);
]]
local shlwapi = ffi.load("shlwapi")
-- shlwapi.SHAutoComplete(hwndEdit, dwFlags)
-- hwndEdit : HWND
-- dwFlags : SHELL_AUTOCOMPLETE_FLAGS
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('SHLWAPI.dll');
const SHAutoComplete = lib.func('__stdcall', 'SHAutoComplete', 'int32_t', ['void *', 'uint32_t']);
// SHAutoComplete(hwndEdit, dwFlags)
// hwndEdit : HWND -> 'void *'
// dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("SHLWAPI.dll", {
  SHAutoComplete: { parameters: ["pointer", "u32"], result: "i32" },
});
// lib.symbols.SHAutoComplete(hwndEdit, dwFlags)
// hwndEdit : HWND -> "pointer"
// dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t SHAutoComplete(
    void* hwndEdit,
    uint32_t dwFlags);
C, "SHLWAPI.dll");
// $ffi->SHAutoComplete(hwndEdit, dwFlags);
// hwndEdit : HWND
// dwFlags : SHELL_AUTOCOMPLETE_FLAGS
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Shlwapi extends StdCallLibrary {
    Shlwapi INSTANCE = Native.load("shlwapi", Shlwapi.class);
    int SHAutoComplete(
        Pointer hwndEdit,   // HWND
        int dwFlags   // SHELL_AUTOCOMPLETE_FLAGS
    );
}
@[Link("shlwapi")]
lib LibSHLWAPI
  fun SHAutoComplete = SHAutoComplete(
    hwndEdit : Void*,   # HWND
    dwFlags : UInt32   # SHELL_AUTOCOMPLETE_FLAGS
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SHAutoCompleteNative = Int32 Function(Pointer<Void>, Uint32);
typedef SHAutoCompleteDart = int Function(Pointer<Void>, int);
final SHAutoComplete = DynamicLibrary.open('SHLWAPI.dll')
    .lookupFunction<SHAutoCompleteNative, SHAutoCompleteDart>('SHAutoComplete');
// hwndEdit : HWND -> Pointer<Void>
// dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SHAutoComplete(
  hwndEdit: THandle;   // HWND
  dwFlags: DWORD   // SHELL_AUTOCOMPLETE_FLAGS
): Integer; stdcall;
  external 'SHLWAPI.dll' name 'SHAutoComplete';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SHAutoComplete"
  c_SHAutoComplete :: Ptr () -> Word32 -> IO Int32
-- hwndEdit : HWND -> Ptr ()
-- dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let shautocomplete =
  foreign "SHAutoComplete"
    ((ptr void) @-> uint32_t @-> returning int32_t)
(* hwndEdit : HWND -> (ptr void) *)
(* dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library shlwapi (t "SHLWAPI.dll"))
(cffi:use-foreign-library shlwapi)

(cffi:defcfun ("SHAutoComplete" shauto-complete :convention :stdcall) :int32
  (hwnd-edit :pointer)   ; HWND
  (dw-flags :uint32))   ; SHELL_AUTOCOMPLETE_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SHAutoComplete = Win32::API::More->new('SHLWAPI',
    'int SHAutoComplete(HANDLE hwndEdit, DWORD dwFlags)');
# my $ret = $SHAutoComplete->Call($hwndEdit, $dwFlags);
# hwndEdit : HWND -> HANDLE
# dwFlags : SHELL_AUTOCOMPLETE_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型