投稿者 snowmansnow  (社会人) 投稿日時 2021/6/5 23:22:48
こんばんは魔界の弁士様。いつもありがとうございます。

①GETPXEL というのは、GDI API の
 GetPixel のことでしょうか?
 ⇒はい、そうです。
②こちらでも確認してみたいので、デバイスコンテストの取得部分も含めて、
 現象を再現可能な実際のコードを提示できますか?
 ⇒はい、何度も変更してたので、できるだけ元にもどしてみました。
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As LongByVal yPoint As LongAs Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As LongAs Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongByVal lpString As StringByVal cch As LongAs Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As LongByVal hdc As LongAs Long
Private Declare Function GetPixel Lib "gdi32.dll" _
 (ByVal hdc As LongPtr, ByVal nXPos As LongByVal nYPos As LongAs Long

Sub hdc2()

Dim color As Long
Dim hwnd As Long
Dim X As Long
Dim Y As Long
Dim hdc As Long

hwnd = WindowFromPoint(0, 0)
hdc = GetDC(hwnd)
If hdc = 0 Then
MsgBox "失敗しました。"
Else

Call GetWindowText(hwnd, Title, 20)
MsgBox Title

'https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1387601913 

For X = 1 To 100
For Y = 1 To 100
    color = GetPixel(hdc, X, Y)
    Cells(Y + 20, X).Value = color
Next
Next
'    Call ReleaseDC(0, hdc) 
   
Call ReleaseDC(hTargetWin, hdc)
End If
End Sub



③教えていただいた
 http://gdipluscode.sakura.ne.jp/gdip/gdip.html
 https://excel.syogyoumujou.com/memorandum/without_picture.html
 ⇒情報量が多くて、直ぐには見れなさそうです、明日以降拝見します。

④.NET の System.Drawing 名前空間のほとんどは、
  GDI+ の API を使って VBA から呼び出せます。
 ⇒net(c#)では、webのコードを参考に、私でも非常に簡単に出来ました。
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Net;

namespace GetpxelFormAppCS
{
    [Guid(Getp.ClassId)]
    public class Getp
    {
        //  COM用のGUID値
        public const string ClassId = "DC6E18DD-3731-4DC0-BC4F-4C64947E652A";
        
       public  string Getpxel(string fn, int x, int y)
        {
            //https://qiita.com/Tachibana446/items/31cdda5cac78cf571a04
            //https://www.atmarkit.co.jp/fdotnet/dotnettips/961dpiresolution/dpiresolution.html
            //
         
            System.Drawing.Bitmap bitmap;
            // ローカルファイルの場合
            bitmap = new Bitmap(fn);
       
            int w = bitmap.Width, h = bitmap.Height;

            Color pixel = bitmap.GetPixel(x-1, y-1);
            
            byte R = pixel.R; 
            byte G = pixel.G; 
            byte B = pixel.B;

            long color = R * 256 * 256 + G * 256 + B;
            double height = color * 0.01;

            bitmap.Dispose();
            return R + ";" + G + ";" + B + ";" + color + ";" + w + ";" + h + ";" + height;
            
        }
}

こんな感じで、クラスライブラリ呼び出ししております。
これを、勉強を兼ねて、VBAで、出来たらなぁと思っております。