質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2684閲覧

Win32 API 実行時エラー SetThreadDesktop

Yshida

総合スコア5

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/09/21 06:12

前提・実現したいこと

興味本位でExcel VBAでWin32 APIコマンドを実行しています。
最終的にバックグラウンド(切り離されたデスクトップ)で処理が走るようにしたいです。

発生している問題・エラーメッセージ

下記ソースコードを実行すると"SetThreadDesktop(hDesktop)"の箇所でエラーが発生します。 エラー発生理由、解消方法をご教示頂けないでしょうか。 実行時エラー '170' アプリケーション定義またはオブジェクト定義のエラーです。

イメージ説明

該当のソースコード 言語:VBA (Excel)

Option Explicit Private Declare PtrSafe Function GetThreadDesktop Lib "user32" (ByVal dwThread As Long) As LongPtr Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long Private Declare PtrSafe Function CreateDesktop Lib "user32.dll" Alias "CreateDesktopW" (ByVal lpszDesktop As LongPtr, ByVal lpszDevice As LongPtr, ByVal pDevmode As LongPtr, ByVal dwFlags As Long, ByVal dwDesiredAccess As Long, ByVal lpsa As LongPtr) As LongPtr Declare PtrSafe Function SwitchDesktop Lib "user32" (ByVal hDesktop As LongPtr) As Long Declare PtrSafe Function SetThreadDesktop Lib "user32" (ByVal hDesktop As LongPtr) As Long Private Declare PtrSafe Function GetLastError Lib "kernel32.dll" () As Long Sub Desktop() Const GENERIC_ALL& = &H10000000 Const MAX_PATH = 260 Dim hDesk As LongPtr Dim hDesktop As LongPtr Dim rcThDesktop As Long hDesk = GetThreadDesktop(GetCurrentThreadId()) hDesktop = CreateDesktop(StrPtr("hidden-desktop"), 0, 0, 0, GENERIC_ALL, 0) rcThDesktop = SetThreadDesktop(hDesktop) If rcThDesktop Then Else Err.Raise GetLastError() End Sub

試したこと

"hDesktop"を"hDesk"等に変更してみましたが、現象に変化ありませんでした。

補足情報(FW/ツールのバージョンなど)

Windows10 Home
64ビット オペレーティングシステム、x64ベース プロセッサ
Excel(Microsoft365)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実際に試せていませんが、Cのサンプルが載っているサイトを見つけました(SetThreadDesktop スレッドへのデスクトップの関連付け )

このサイトによると、GetThreadDesktopを実行してから、OpenInputDesktopを使って元の入力デスクトップを退避してやらないといけないみたいです。以降の手順もありますので、このサイトを参考にされてはどうでしょうか。

投稿2020/09/21 08:40

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yshida

2020/09/21 10:51

ご回答ありがとうございました。 Declare PtrSafe Function OpenInputDesktop Lib "user32" (ByVal dwFlags As Long, ByVal fInherit As Long, ByVal dwDesiredAccess As Long) As LongPtr の宣言をして、 hDesk = GetThreadDesktop(GetCurrentThreadId()) の後に下記を追加しましたが、 Const DESKTOP_CREATEWINDOW = &H2& Dim hInputDesk As LongPtr hInputDesk = OpenInputDesktop(0, False, DESKTOP_CREATEWINDOW) 今度は同じく"SetThreadDesktop(hDesktop)"の箇所で 実行時エラー '5' プロシージャの呼び出し、または引数が不正です。 が発生しました。試行錯誤してみます。
Yshida

2020/09/27 09:09 編集

インタプリタ言語では実現することは困難なのでは、と思えるようになり一旦、中断することにしました。本件、ご協力頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問