Win32 API 日本語リファレンス
ホーム › System.AddressBook › ChangeIdleRoutine

ChangeIdleRoutine

関数
登録済みアイドルルーチンの優先度や間隔などの属性を変更する。
DLLMAPI32.dll呼出規約winapi

シグネチャ

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

void ChangeIdleRoutine(
    void* ftg,
    PFNIDLE lpfnIdle,
    void* lpvIdleParam,
    SHORT priIdle,
    DWORD csecIdle,
    WORD iroIdle,
    WORD ircIdle
);

パラメーター

名前型方向説明
ftgvoid*inout変更する対象のアイドルルーチンのFTGハンドル。
lpfnIdlePFNIDLEin新たに設定するPFNIDLEコールバック関数へのポインタ。
lpvIdleParamvoid*inoutコールバックへ渡すコンテキストデータへのポインタ。NULL可。
priIdleSHORTin新しい実行優先度を示すSHORT値。
csecIdleDWORDin新しい呼び出し間隔をミリ秒単位で示すDWORD値。
iroIdleWORDin新しい実行制御フラグを示すWORD値。
ircIdleWORDin上記フィールドのうち実際に変更する項目を指定するWORD値のマスク。

戻り値の型: void

公式ドキュメント

FNIDLE ベースのアイドルルーチンの特性の一部またはすべてを変更します。

戻り値

なし。

解説(Remarks)

次の関数は、MAPI アイドルエンジン、および FNIDLE 関数プロトタイプに基づくアイドルルーチンを扱います。

アイドルルーチン関数 用途
ChangeIdleRoutine
登録済みのアイドルルーチンの特性を変更します。
DeregisterIdleRoutine
登録済みのアイドルルーチンを MAPI システムから削除します。
EnableIdleRoutine
登録済みのアイドルルーチンを MAPI システムから削除せずに、無効化または再度有効化します。
FtgRegisterIdleRoutine
アイドルルーチンを MAPI システムに追加します。その際、有効化するかどうかを指定できます。
MAPIDeInitIdle
呼び出し元アプリケーションの MAPI アイドルエンジンをシャットダウンします。
MAPIInitIdle
呼び出し元アプリケーションの MAPI アイドルエンジンを初期化します。

ChangeIdleRoutine、DeregisterIdleRoutine、および EnableIdleRoutine は、FtgRegisterIdleRoutine が返す関数タグを入力パラメーターとして受け取ります。

プラットフォームのすべてのフォアグラウンドタスクがアイドル状態になると、MAPI アイドルエンジンは、実行可能な状態にあるアイドルルーチンのうち最も優先度の高いものを呼び出します。同じ優先度のアイドルルーチン間では、呼び出し順序は保証されません。

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

各言語での呼び出し定義

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

void ChangeIdleRoutine(
    void* ftg,
    PFNIDLE lpfnIdle,
    void* lpvIdleParam,
    SHORT priIdle,
    DWORD csecIdle,
    WORD iroIdle,
    WORD ircIdle
);
[DllImport("MAPI32.dll", ExactSpelling = true)]
static extern void ChangeIdleRoutine(
    IntPtr ftg,   // void* in/out
    IntPtr lpfnIdle,   // PFNIDLE
    IntPtr lpvIdleParam,   // void* in/out
    short priIdle,   // SHORT
    uint csecIdle,   // DWORD
    ushort iroIdle,   // WORD
    ushort ircIdle   // WORD
);
<DllImport("MAPI32.dll", ExactSpelling:=True)>
Public Shared Sub ChangeIdleRoutine(
    ftg As IntPtr,   ' void* in/out
    lpfnIdle As IntPtr,   ' PFNIDLE
    lpvIdleParam As IntPtr,   ' void* in/out
    priIdle As Short,   ' SHORT
    csecIdle As UInteger,   ' DWORD
    iroIdle As UShort,   ' WORD
    ircIdle As UShort   ' WORD
)
End Sub
' ftg : void* in/out
' lpfnIdle : PFNIDLE
' lpvIdleParam : void* in/out
' priIdle : SHORT
' csecIdle : DWORD
' iroIdle : WORD
' ircIdle : WORD
Declare PtrSafe Sub ChangeIdleRoutine Lib "mapi32" ( _
    ByVal ftg As LongPtr, _
    ByVal lpfnIdle As LongPtr, _
    ByVal lpvIdleParam As LongPtr, _
    ByVal priIdle As Integer, _
    ByVal csecIdle As Long, _
    ByVal iroIdle As Integer, _
    ByVal ircIdle As Integer)
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

ChangeIdleRoutine = ctypes.windll.mapi32.ChangeIdleRoutine
ChangeIdleRoutine.restype = None
ChangeIdleRoutine.argtypes = [
    ctypes.POINTER(None),  # ftg : void* in/out
    ctypes.c_void_p,  # lpfnIdle : PFNIDLE
    ctypes.POINTER(None),  # lpvIdleParam : void* in/out
    ctypes.c_short,  # priIdle : SHORT
    wintypes.DWORD,  # csecIdle : DWORD
    ctypes.c_ushort,  # iroIdle : WORD
    ctypes.c_ushort,  # ircIdle : WORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('MAPI32.dll')
ChangeIdleRoutine = Fiddle::Function.new(
  lib['ChangeIdleRoutine'],
  [
    Fiddle::TYPE_VOIDP,  # ftg : void* in/out
    Fiddle::TYPE_VOIDP,  # lpfnIdle : PFNIDLE
    Fiddle::TYPE_VOIDP,  # lpvIdleParam : void* in/out
    Fiddle::TYPE_SHORT,  # priIdle : SHORT
    -Fiddle::TYPE_INT,  # csecIdle : DWORD
    -Fiddle::TYPE_SHORT,  # iroIdle : WORD
    -Fiddle::TYPE_SHORT,  # ircIdle : WORD
  ],
  Fiddle::TYPE_VOID)
#[link(name = "mapi32")]
extern "system" {
    fn ChangeIdleRoutine(
        ftg: *mut (),  // void* in/out
        lpfnIdle: *const core::ffi::c_void,  // PFNIDLE
        lpvIdleParam: *mut (),  // void* in/out
        priIdle: i16,  // SHORT
        csecIdle: u32,  // DWORD
        iroIdle: u16,  // WORD
        ircIdle: u16  // WORD
    );
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("MAPI32.dll")]
public static extern void ChangeIdleRoutine(IntPtr ftg, IntPtr lpfnIdle, IntPtr lpvIdleParam, short priIdle, uint csecIdle, ushort iroIdle, ushort ircIdle);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MAPI32_ChangeIdleRoutine' -Namespace Win32 -PassThru
# $api::ChangeIdleRoutine(ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle)
#uselib "MAPI32.dll"
#func global ChangeIdleRoutine "ChangeIdleRoutine" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; ChangeIdleRoutine ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle
; ftg : void* in/out -> "sptr"
; lpfnIdle : PFNIDLE -> "sptr"
; lpvIdleParam : void* in/out -> "sptr"
; priIdle : SHORT -> "sptr"
; csecIdle : DWORD -> "sptr"
; iroIdle : WORD -> "sptr"
; ircIdle : WORD -> "sptr"
#uselib "MAPI32.dll"
#func global ChangeIdleRoutine "ChangeIdleRoutine" sptr, sptr, sptr, int, int, int, int
; ChangeIdleRoutine ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle
; ftg : void* in/out -> "sptr"
; lpfnIdle : PFNIDLE -> "sptr"
; lpvIdleParam : void* in/out -> "sptr"
; priIdle : SHORT -> "int"
; csecIdle : DWORD -> "int"
; iroIdle : WORD -> "int"
; ircIdle : WORD -> "int"
; void ChangeIdleRoutine(void* ftg, PFNIDLE lpfnIdle, void* lpvIdleParam, SHORT priIdle, DWORD csecIdle, WORD iroIdle, WORD ircIdle)
#uselib "MAPI32.dll"
#func global ChangeIdleRoutine "ChangeIdleRoutine" intptr, intptr, intptr, int, int, int, int
; ChangeIdleRoutine ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle
; ftg : void* in/out -> "intptr"
; lpfnIdle : PFNIDLE -> "intptr"
; lpvIdleParam : void* in/out -> "intptr"
; priIdle : SHORT -> "int"
; csecIdle : DWORD -> "int"
; iroIdle : WORD -> "int"
; ircIdle : WORD -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	mapi32 = windows.NewLazySystemDLL("MAPI32.dll")
	procChangeIdleRoutine = mapi32.NewProc("ChangeIdleRoutine")
)

// ftg (void* in/out), lpfnIdle (PFNIDLE), lpvIdleParam (void* in/out), priIdle (SHORT), csecIdle (DWORD), iroIdle (WORD), ircIdle (WORD)
r1, _, err := procChangeIdleRoutine.Call(
	uintptr(ftg),
	uintptr(lpfnIdle),
	uintptr(lpvIdleParam),
	uintptr(priIdle),
	uintptr(csecIdle),
	uintptr(iroIdle),
	uintptr(ircIdle),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // void
procedure ChangeIdleRoutine(
  ftg: Pointer;   // void* in/out
  lpfnIdle: Pointer;   // PFNIDLE
  lpvIdleParam: Pointer;   // void* in/out
  priIdle: Smallint;   // SHORT
  csecIdle: DWORD;   // DWORD
  iroIdle: Word;   // WORD
  ircIdle: Word   // WORD
); stdcall;
  external 'MAPI32.dll' name 'ChangeIdleRoutine';
result := DllCall("MAPI32\ChangeIdleRoutine"
    , "Ptr", ftg   ; void* in/out
    , "Ptr", lpfnIdle   ; PFNIDLE
    , "Ptr", lpvIdleParam   ; void* in/out
    , "Short", priIdle   ; SHORT
    , "UInt", csecIdle   ; DWORD
    , "UShort", iroIdle   ; WORD
    , "UShort", ircIdle   ; WORD
    , "Int")   ; return: void
●ChangeIdleRoutine(ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle) = DLL("MAPI32.dll", "int ChangeIdleRoutine(void*, void*, void*, int, dword, int, int)")
# 呼び出し: ChangeIdleRoutine(ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle)
# ftg : void* in/out -> "void*"
# lpfnIdle : PFNIDLE -> "void*"
# lpvIdleParam : void* in/out -> "void*"
# priIdle : SHORT -> "int"
# csecIdle : DWORD -> "dword"
# iroIdle : WORD -> "int"
# ircIdle : WORD -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "mapi32" fn ChangeIdleRoutine(
    ftg: ?*anyopaque, // void* in/out
    lpfnIdle: ?*anyopaque, // PFNIDLE
    lpvIdleParam: ?*anyopaque, // void* in/out
    priIdle: i16, // SHORT
    csecIdle: u32, // DWORD
    iroIdle: u16, // WORD
    ircIdle: u16 // WORD
) callconv(std.os.windows.WINAPI) void;
proc ChangeIdleRoutine(
    ftg: pointer,  # void* in/out
    lpfnIdle: pointer,  # PFNIDLE
    lpvIdleParam: pointer,  # void* in/out
    priIdle: int16,  # SHORT
    csecIdle: uint32,  # DWORD
    iroIdle: uint16,  # WORD
    ircIdle: uint16  # WORD
) {.importc: "ChangeIdleRoutine", stdcall, dynlib: "MAPI32.dll".}
pragma(lib, "mapi32");
extern(Windows)
void ChangeIdleRoutine(
    void* ftg,   // void* in/out
    void* lpfnIdle,   // PFNIDLE
    void* lpvIdleParam,   // void* in/out
    short priIdle,   // SHORT
    uint csecIdle,   // DWORD
    ushort iroIdle,   // WORD
    ushort ircIdle   // WORD
);
ccall((:ChangeIdleRoutine, "MAPI32.dll"), stdcall, Cvoid,
      (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Int16, UInt32, UInt16, UInt16),
      ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle)
# ftg : void* in/out -> Ptr{Cvoid}
# lpfnIdle : PFNIDLE -> Ptr{Cvoid}
# lpvIdleParam : void* in/out -> Ptr{Cvoid}
# priIdle : SHORT -> Int16
# csecIdle : DWORD -> UInt32
# iroIdle : WORD -> UInt16
# ircIdle : WORD -> UInt16
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void ChangeIdleRoutine(
    void* ftg,
    void* lpfnIdle,
    void* lpvIdleParam,
    int16_t priIdle,
    uint32_t csecIdle,
    uint16_t iroIdle,
    uint16_t ircIdle);
]]
local mapi32 = ffi.load("mapi32")
-- mapi32.ChangeIdleRoutine(ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle)
-- ftg : void* in/out
-- lpfnIdle : PFNIDLE
-- lpvIdleParam : void* in/out
-- priIdle : SHORT
-- csecIdle : DWORD
-- iroIdle : WORD
-- ircIdle : WORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('MAPI32.dll');
const ChangeIdleRoutine = lib.func('__stdcall', 'ChangeIdleRoutine', 'void', ['void *', 'void *', 'void *', 'int16_t', 'uint32_t', 'uint16_t', 'uint16_t']);
// ChangeIdleRoutine(ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle)
// ftg : void* in/out -> 'void *'
// lpfnIdle : PFNIDLE -> 'void *'
// lpvIdleParam : void* in/out -> 'void *'
// priIdle : SHORT -> 'int16_t'
// csecIdle : DWORD -> 'uint32_t'
// iroIdle : WORD -> 'uint16_t'
// ircIdle : WORD -> 'uint16_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。
const lib = Deno.dlopen("MAPI32.dll", {
  ChangeIdleRoutine: { parameters: ["pointer", "pointer", "pointer", "i16", "u32", "u16", "u16"], result: "void" },
});
// lib.symbols.ChangeIdleRoutine(ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle)
// ftg : void* in/out -> "pointer"
// lpfnIdle : PFNIDLE -> "pointer"
// lpvIdleParam : void* in/out -> "pointer"
// priIdle : SHORT -> "i16"
// csecIdle : DWORD -> "u32"
// iroIdle : WORD -> "u16"
// ircIdle : WORD -> "u16"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void ChangeIdleRoutine(
    void* ftg,
    void* lpfnIdle,
    void* lpvIdleParam,
    int16_t priIdle,
    uint32_t csecIdle,
    uint16_t iroIdle,
    uint16_t ircIdle);
C, "MAPI32.dll");
// $ffi->ChangeIdleRoutine(ftg, lpfnIdle, lpvIdleParam, priIdle, csecIdle, iroIdle, ircIdle);
// ftg : void* in/out
// lpfnIdle : PFNIDLE
// lpvIdleParam : void* in/out
// priIdle : SHORT
// csecIdle : DWORD
// iroIdle : WORD
// ircIdle : WORD
// 構造体/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 Mapi32 extends StdCallLibrary {
    Mapi32 INSTANCE = Native.load("mapi32", Mapi32.class);
    void ChangeIdleRoutine(
        Pointer ftg,   // void* in/out
        Callback lpfnIdle,   // PFNIDLE
        Pointer lpvIdleParam,   // void* in/out
        short priIdle,   // SHORT
        int csecIdle,   // DWORD
        short iroIdle,   // WORD
        short ircIdle   // WORD
    );
}
@[Link("mapi32")]
lib LibMAPI32
  fun ChangeIdleRoutine = ChangeIdleRoutine(
    ftg : Void*,   # void* in/out
    lpfnIdle : Void*,   # PFNIDLE
    lpvIdleParam : Void*,   # void* in/out
    priIdle : Int16,   # SHORT
    csecIdle : UInt32,   # DWORD
    iroIdle : UInt16,   # WORD
    ircIdle : UInt16   # WORD
  ) : Void
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef ChangeIdleRoutineNative = Void Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Int16, Uint32, Uint16, Uint16);
typedef ChangeIdleRoutineDart = void Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, int, int, int, int);
final ChangeIdleRoutine = DynamicLibrary.open('MAPI32.dll')
    .lookupFunction<ChangeIdleRoutineNative, ChangeIdleRoutineDart>('ChangeIdleRoutine');
// ftg : void* in/out -> Pointer<Void>
// lpfnIdle : PFNIDLE -> Pointer<Void>
// lpvIdleParam : void* in/out -> Pointer<Void>
// priIdle : SHORT -> Int16
// csecIdle : DWORD -> Uint32
// iroIdle : WORD -> Uint16
// ircIdle : WORD -> Uint16
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
procedure ChangeIdleRoutine(
  ftg: Pointer;   // void* in/out
  lpfnIdle: Pointer;   // PFNIDLE
  lpvIdleParam: Pointer;   // void* in/out
  priIdle: Smallint;   // SHORT
  csecIdle: DWORD;   // DWORD
  iroIdle: Word;   // WORD
  ircIdle: Word   // WORD
); stdcall;
  external 'MAPI32.dll' name 'ChangeIdleRoutine';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "ChangeIdleRoutine"
  c_ChangeIdleRoutine :: Ptr () -> Ptr () -> Ptr () -> Int16 -> Word32 -> Word16 -> Word16 -> IO ()
-- ftg : void* in/out -> Ptr ()
-- lpfnIdle : PFNIDLE -> Ptr ()
-- lpvIdleParam : void* in/out -> Ptr ()
-- priIdle : SHORT -> Int16
-- csecIdle : DWORD -> Word32
-- iroIdle : WORD -> Word16
-- ircIdle : WORD -> Word16
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let changeidleroutine =
  foreign "ChangeIdleRoutine"
    ((ptr void) @-> (ptr void) @-> (ptr void) @-> int16_t @-> uint32_t @-> uint16_t @-> uint16_t @-> returning void)
(* ftg : void* in/out -> (ptr void) *)
(* lpfnIdle : PFNIDLE -> (ptr void) *)
(* lpvIdleParam : void* in/out -> (ptr void) *)
(* priIdle : SHORT -> int16_t *)
(* csecIdle : DWORD -> uint32_t *)
(* iroIdle : WORD -> uint16_t *)
(* ircIdle : WORD -> uint16_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library mapi32 (t "MAPI32.dll"))
(cffi:use-foreign-library mapi32)

(cffi:defcfun ("ChangeIdleRoutine" change-idle-routine :convention :stdcall) :void
  (ftg :pointer)   ; void* in/out
  (lpfn-idle :pointer)   ; PFNIDLE
  (lpv-idle-param :pointer)   ; void* in/out
  (pri-idle :int16)   ; SHORT
  (csec-idle :uint32)   ; DWORD
  (iro-idle :uint16)   ; WORD
  (irc-idle :uint16))   ; WORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $ChangeIdleRoutine = Win32::API::More->new('MAPI32',
    'void ChangeIdleRoutine(LPVOID ftg, LPVOID lpfnIdle, LPVOID lpvIdleParam, short priIdle, DWORD csecIdle, WORD iroIdle, WORD ircIdle)');
# my $ret = $ChangeIdleRoutine->Call($ftg, $lpfnIdle, $lpvIdleParam, $priIdle, $csecIdle, $iroIdle, $ircIdle);
# ftg : void* in/out -> LPVOID
# lpfnIdle : PFNIDLE -> LPVOID
# lpvIdleParam : void* in/out -> LPVOID
# priIdle : SHORT -> short
# csecIdle : DWORD -> DWORD
# iroIdle : WORD -> WORD
# ircIdle : WORD -> WORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。

関連項目

使用する型