問題タブ [getwindowlong]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
9083 参照

c# - C# での GetWindowLong と GetWindowLongPtr

私は次のように GetWindowLong を使用していました。

しかし、MSDN のドキュメントによると、GetWindowLongPtr を使用して 64 ビット互換にすることになっています。 http://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx

GetWindowLongPtr の MSDN ドキュメントには、(C++ で) 次のように定義する必要があると書かれています。

以前は戻り値の型として IntPtr を使用していましたが、LONG_PTR と同等のものには一体何を使用するのでしょうか? C# で GetWindowLong が次のように定義されていることも確認しました。

何が正しいのですか? また、適切な 64 ビット互換性を確保するにはどうすればよいですか?

0 投票する
2 に答える
8997 参照

c# - 32 ビット プラットフォームで GetWindowLongPtr と SetWindowLongPtr をピンボークするにはどうすればよいですか?

GetWindowLongPtrSetWindowLongPtrに P/Invoke したいのですが、それらに関する矛盾する情報が表示されます。

一部のソースによると、32 ビット プラットフォームでは、GetWindowLongPtr は GetWindowLong を呼び出す単なるプリプロセッサ マクロであり、GetWindowLongPtr は user32.dll のエントリ ポイントとして存在しません。例えば:

  • SetWindowLongPtrのpinvoke.net エントリには、IntPtr.Size をチェックしてから SetWindowLong または SetWindowLongPtr を呼び出す静的メソッドがあり、「レガシー OS は SetWindowLongPtr をサポートしていません」というコメントがあります。「レガシーOS」が何を意味するのかについての説明はありません。
  • StackOverflowに関する回答には、「32 ビット システムでは、GetWindowLongPtr は、GetWindowLong を指す単なる C マクロです」と記載されています。

したがって、これらのソースは、*Ptr エントリ ポイントが、たとえば 32 ビット Windows 7 に同梱されているバージョンの user32.dll には存在しないことを示しているようです。

しかし、MSDN のドキュメントにはこれに関する記述はありません。MSDN によると、 SetWindowLongPtr はSetWindowLongに取って代わり、単純明快です。また、 SetWindowLongPtr ページの要件セクションによると、SetWindowLongPtr は Windows 2000 以降 (クライアント エディションとサーバー エディションの両方) に user32.dll に含まれているようです。繰り返しになりますが、32 ビット OS で欠落しているエントリ ポイントについては言及されていません。

真実はその中間にあるのではないかと思います: C++ コンパイラに古い OS をターゲットにする (つまり、Win9x と NT4 で実行されるものをコンパイルする) ように指示すると、ヘッダー ファイルは SetWindowLongPtr を SetWindowLong を呼び出すマクロとして宣言しますが、エントリ ポイントはおそらく Windows 2000 以降に存在し、これらのプラットフォームをターゲットにするようにコンパイラに指示すると、(マクロではなく) 直接取得できます。しかし、それは単なる推測です。私はそれを掘り下げて検証するためのリソースやノウハウを本当に持っていません。

ターゲット プラットフォームが役割を果たす可能性もあります。x86 プラットフォーム用にアプリをコンパイルする場合は、64 ビット OS で SetWindowLongPtr を呼び出すべきではありません。繰り返しますが、私はその質問について考えるのに十分な知識を持っていますが、答えを見つける方法がわかりません. MSDN は、SetWindowLongPtr が常に正しいことを示唆しているようです。

単純に SetWindowLongPtr に P/Invoke を実行して、それを実行しても安全かどうか教えてもらえますか? (Windows 2000 以降を想定しています。) SetWindowLongPtr を P/Invoking すると、正しいエントリ ポイントが得られます。

  • 32 ビット OS で x86 プラットフォームを対象とするアプリを実行するとどうなりますか?
  • x86 プラットフォームを対象とするアプリを 64 ビット OS で実行するとどうなりますか?
  • x64 プラットフォームを対象とするアプリを 64 ビット OS で実行するとどうなりますか?
0 投票する
3 に答える
1162 参照

winapi - GetWindowLong および GetWindowInfo からの未知の拡張ウィンドウ スタイル値

GetWindowLog プロパティを使用してウィンドウの拡張ウィンドウ スタイルのクエリを呼び出していますが、多くの場合、msdn に記載されていない値が返されます。

特に 0x00000800L と 0x00000100L または 2 つの組み合わせ。これらの値に関する情報、または msdn サイトに記載されているよりも完全なリストを持っている人はいますか?

0 投票する
1 に答える
1426 参照

sendmessage - 他のウィンドウからのコントロール名

他のウィンドウからテキスト値を読み取り、その値を別のアプリケーションに照会する必要があります (私の質問は最初のタスクに関するものです)...つまり、他のウィンドウを「スパイ」しています (私たちの製品に関連して使用するサードパーティのアプリケーション) )、「受け入れる」ボタンがクリックされるのを待って、テキストボックスから値を読み取ります。この別のアプリケーションであるダイアログ ボックスには、複数のテキスト ボックスとコマンド ボタンがあります。マウス フックを作成し、このアプリケーションの表示時にアクティブにしています。このウィンドウの四角形内のすべてのマウスの動きを読み取っています。テキスト、キャプション、子ウィンドウ ID、四角形、左/右/中央/ホイール クリックをつかみます。「受け入れる」ボタンのクリックをつかむことができます。ボタンのキャプションを見ることができ、そのウィンドウを読み取ったり、テキストを取得したり、クリックされたボタンを特定したりできます。これで、すべての EDIT クラスの値を読み取り、それらのウィンドウ ハンドルや四角形などを取得できます。しかし、それらをクラス コレクション内の一意のアイテムとして識別できません。目的のテキスト ボックスの値を具体的に読み取る必要があります。幸いなことに、私が興味を持っているテキスト ボックスは、EDIT クラス ループからテキストを読み込んでいるときに、ALWAYS COMES FIRST IN MY LOOP です。ただし、より具体的にしたいと思います。NAMEのテキストボックスを読んでいることを確認してください。知っている。開発中に、その名前を読み取り、プログラムにハードコーディングすることができました。私の疑いは、コントロール名がバイナリコードに保存されていないことです。私の理解では、コントロール ID、ウィンドウ ハンドルはウィンドウの作成時に作成され、コントロール名 (たとえば txtOrderNumber) への参照はまったくありません。ボタンのキャプションのために特定できる場合 (つまり、どのボタンがクリックされたかを判断できます)、EDIT クラス項目でロックされ、値を読み取るときに幸運な最初の推測にスローされます。私の質問は、別のウィンドウからコントロール名を取得する方法です。このタスクでは、EDIT クラスのインスタンス名について知りたいと思っています。プロジェクトからのいくつかのコード(短縮)を次に示します。

Dim hWnd As IntPtr = FindWindow(Nothing, _windowText)

'API: FindWindowEx 'API: SendMessage 'API: GetClassName 'API: GetWindowTextLength 'API: GetWindowText 'API: WM_GETTEXT

私は GetWindowLong と GetDlgCtrlID API を見て、ほとんどのフラグを試しましたが、これまでのところ成功していません...

ヒント、手がかり、指示をいただければ幸いです。ありがとうございました

0 投票する
1 に答える
327 参照

c++ - winapi: 装飾の削除

これは重複しているように見えますが、最初に聞いてください。これは、デバッグ側の詳細です。hereの方法を使用して、ウィンドウの境界線を削除しようとしています。

これらの機能が機能しなくなる原因は何ですか? を使用してウィンドウを非表示にしShowWindow(Handle, SW_HIDE)ても機能しません。多くの関数を持つ独自の Window クラスを作成したので、ここにコード全体を貼り付けたくありません。

ウィンドウの初期化関数は次のとおりです。

WindowPropsご覧のとおり、作成中のウィンドウに関するさまざまな情報が含まれています。HWNDクラスには、ウィンドウ ハンドラーを指すポインター変数もあります。

メインで試したことがいくつかあります。ここで、sw2 はウィンドウ クラスへのポインターです。

コードをデバッグする場所についての提案が欲しいです。はるかに単純なウィンドウ プロジェクト (Microsoft のサンプル プロジェクト) でテストしたので、関数が機能することはわかっています。

0 投票する
1 に答える
806 参照

c++ - WM_CTLCOLORSTATIC lParam、C++ WINAPI

メッセージ WM_CTLCOLORSTATIC が受信されたときに、メッセージを送信しているコントロールの ID を取得することをダイアログ ウィンドウ プロシージャに含めようとしています。

問題は... WM_CTLCOLORSTATIC の lParam を型キャストしようとすると、正しくない値 65535 が返されます。最大 UINT ID 65535 のリソース アイテムすらありません。

なぜこれが起こっているのかについての洞察を教えてもらえますか?

0 投票する
1 に答える
2355 参照

winapi - VB6 SetWindowLong が Windows 7 64 ビットで更新の問題を引き起こす

私はまだサポートしており、GetWindowLong と SetWindowLong を利用して設定に応じて実行時に ControlBox を削除する古い vb6 アプリケーションをサポートしています。これはすべての 32 ビット システムでうまく機能しますが、64 ビット システムで実行すると、メイン ウィンドウが適切に更新されなくなります。問題は、TextBox、ListBox、または CommandButton などの入力コントロールにあるようです。特定のウィンドウに覆われた後、フォーカスを受け取るまで表示されず、境界線が正しく表示されません。

MSDN のドキュメントhttp://msdn.microsoft.com/en-us/library/ms633591%28v=vs.85%29.aspxを読みましたが、これらの関数は互換性を保つために ...WindowLongPtr 関数に取って代わられていると書かれています32 ビット システムと 64 ビット システムの両方で使用できます。私が読むことができたすべてのものから、実際には、異なるプラットフォームで実行するのではなく、32 ビット バージョンと 64 ビット バージョンの両方をコンパイルすることについて話していることがわかりました。宣言をから変更しようとしました

しかし、「user32 に DLL エントリ ポイント GetWindowLongPtrA が見つかりません」というエラーが表示されます。そこで、エイリアスを「... WindowLongA」のままにしてみましたが、それが実行され、予想どおり、更新の問題に違いはありません。

他の誰かがこれを見たことがありますか、何か提案がありますか?

コードの使用方法のサンプルを次に示します。

ありがとう

dbl

0 投票する
0 に答える
195 参照

xml - Powershell 2 - Get-WinEvent -FilterXML

Powershell のエキスパートの皆様、こんにちは。

私は次のことを達成しようとしています。ログ メッセージに以下を含む、過去 30 分間の Windows アプリケーション ログを取得します。「接続エラー」

私はPowershellに精通しておらず、検索したところ、-FilterXMLを使用するのが最速の解決策に見えますが、エラーログから「接続エラー」を検索する構文を完了することができませんでした。

これは私が持っているものです。「接続エラー」エラーのみを探す必要がある部分を追加する方法を教えてください。

よろしくお願いいたします。