90739


現在 PC の位置情報を取得するソフトウェアを作成しています。  
位置情報の取得は `System.Device.Location.GeoCoordinateWatcher` を使用して取得しています。  
具体的には C# で以下のようなコードを書き、 .NET Framework 4.8 で実行しています。

下記コードは、 Windows10 ではたまに取得できないことはあるものの、問題無く動作しています。  
これを Windows11 で動作させると `TryStart()` は `ture` を返してくるのですが、
`position.Location.IsUnknown` に `true` が設定され、現在地が取得できません。 1 秒間隔で何度も実行するようにしても、
1 回も取得できない状況です。

Windows11 では `GeoCoordinateWatcher()`
を使って位置情報を取得することはできないのでしょうか？もしくは何か準備が必要なのでしょうか？  
(Windows 側の設定のプライバシーの位置情報は全て "ON" に設定しています)

何かご存知でしたらご教示いただけますと幸いです。  
よろしくお願いいたします。

[code]

    ...
    
    using ( var watcher = new GeoCoordinateWatcher() )
    {
        bool b = watcher.TryStart(false, TimeSpan.FromMilliseconds(1000));
        buf = $"TryStart の戻り値={b}\r\n";
    
        var position = watcher.Position;
        if ( !position.Location.IsUnknown )
        {
            buf += $"Timestamp={position.Timestamp}\r\nLatitude={position.Location.Latitude}\r\nLongitude={position.Location.Longitude}\r\n";
        }
        else
        {
            buf += "取得できませんでした。\r\n";
        }
    }
    ...
    
[/code]


CC BY-SA 4.0
2022-08-24T08:43:26.083
90731
2022-08-25T11:43:19.720
2022-08-25T00:07:13.227
3060
54118
question
c# windows gps
Windows11 で位置情報の取得ができない


watcher.Position を取得する時点では Status がまだ NoData なので位置情報が取得できないのでは？

であれば、Status が Ready になるまで待ってみてはいかがですか？

どのようにするかの例は以下の記事の下の方の回答を見てください。

<https://social.msdn.microsoft.com/Forums/ja-
JP/2fbc243d-53ce-49bf-b79a-ebce13adf3d6/deleted?forum=netfxgeneralja>


CC BY-SA 4.0
2022-08-24T22:01:13.843
90739
2022-08-24T22:01:13.843
51338
90731
answer


Status が Ready になるまで待ったら取得できました。具体的には以下の様にすれば Windows11 でも取得することができました。

[code]

    ...
    
    using ( var watcher = new GeoCoordinateWatcher() )
    {
        bool b = watcher.TryStart(false, TimeSpan.FromMilliseconds(1000));
        buf = $"TryStart の戻り値={b}\r\n";
    
        // vvv 追加
        while ( watcher.Status != GeoPositionStatus.Ready )
        {
            Thread.Sleep(1000);
        }
        // ^^^ 追加
    
        var position = watcher.Position;
        if ( !position.Location.IsUnknown )
        {
            buf += $"Timestamp={position.Timestamp}\r\nLatitude={position.Location.Latitude}\r\nLongitude={position.Location.Longitude}\r\n";
        }
        else
        {
            buf += "取得できませんでした。\r\n";
        }
    }
    
    ...
    
[/code]


CC BY-SA 4.0
2022-08-25T11:43:19.720
90755
2022-08-25T11:43:19.720
54118
90731
answer