問題タブ [setwindowlong]
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.
c# - Windows スタイルから WS_BORDER と WS_CAPTION を削除しても機能しない
ウィンドウから境界線とキャプションを削除し、サイズをユーザーの解像度に設定して中央に配置する小さなアプリを C# で作成しました。境界線に煩わされることなく、ウィンドウ モードでゲームをプレイしたいときに使用するユーティリティです。ほとんどのゲームですべて正常に動作しますが、最近リリースされたゲーム Alpha Protocol で使用しようとしましたが、動作しません。ゲームが私の変更を元に戻すと言っても過言ではありませんが、それが本当かどうかはわかりません. インポートされた API 関数 MoveWindow、SetWindowLong、および SetWindowPos を使用しています。
スニペット:
c# - 32 ビット プラットフォームで GetWindowLongPtr と SetWindowLongPtr をピンボークするにはどうすればよいですか?
GetWindowLongPtrとSetWindowLongPtrに 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 で実行するとどうなりますか?
delphi - SetWindowLong コマンドでツリービューの方向を変更すると、右クリック (ポップアップ メニュー) が機能しない
SetWindowLong コマンドを使用してツリービューの方向を変更すると、そのノードの popupmenu が表示されません。完全なコードはここにあります:
c# - SetWindowLongが一部のコンピューターで機能しない
編集:詳細情報特定のコンピューター上の特定のアプリケーションに絞り込みました。特定のモニターでフルスクリーンモードでChromeを起動しようとしています。これは、私がテストしたほとんどのシステムで完全に機能しますが、Windows 7 Pro 32ビットを実行しているコンピューターのセットに遭遇しました。これらのコンピューターは正しく移動およびサイズ変更されていますが、境界線とボタンはそのままです。
Chromeウィンドウはすべて単一のChromeプロセスで生成され、そのライフサイクルは不安定であることに気付きましたが、各Chromeインスタンスを独自の親プロセスでそのように起動し続ける個別のデータディレクトリを使用してこれを回避することができました。Chromeは、フルスクリーンで1セットのコンピューターでのみ起動する際に問題が発生する唯一のアプリケーションのようです。たとえば、calc.exeを実行すると、テストしたすべてのシステムで問題なく境界線が最大化および削除されます。各システムで実行されているchromeのバージョンが同じであることを確認しました。誰かがこの問題、または問題をさらにトラブルシューティングする方法についてより多くの洞察を持っていれば、私は本当に感謝します。
SetWindowLongを使用してフルスクリーンモードでアプリケーションを実行しようとしていますが、最新のコンピューターを試してみるまではうまく機能していました。私は基本的にこの質問で参照されているコードを使用しています:ウィンドウの境界線を削除しますか?
これは、私のラップトップ(Windows 7 Ultimate)とテスト済みのいくつかのワークボックス(Windows 7 POS Embedded)の両方で正常に機能しますが、職場の別のコンピューター(Windows 7 Professional)では機能しません。SetWindowLong呼び出しは、機能しているはずであることを示す期待値を返します。SetWindowPosの呼び出しは、ウィンドウのサイズを正しく変更しているので正常に機能しますが、境界線とボタンはまだあります。SetWindowLongへの呼び出しがまったくなかったかのように機能しています。現時点ではアイデアがないので、助けていただければ幸いです。
編集:これが午前1時の赤い目の栄光のコードです。リンクされた質問のほとんど直接のコピー。
c - SetWindowLongPtrが機能していないようです
別のウィンドウを(別のプロセスで)サブクラス化しようとしたため、SetWindowLongPtrを呼び出すdllを挿入しましたが、失敗し、GetLastErrorは5を返します。
編集:その反抗的に正しいPID。
編集2:間違ったHWNDを取得していましたが、これは修正されました(コードも編集しました) エラー5は発生しなくなりました(GetLastErrorから)
読んでくれてありがとう!
api - SetWindowLong と SetLayeredWindowAttributes が別のユーザー C# で機能しない
目標は
Win XP で実行されているアプリケーション (ターゲット) の不透明度を変更したいと考えています。
状況
- Windows XP に AD (アクティブ ディレクトリ) ユーザー アカウント (some-domain\username) としてログインしました。
- ターゲット アプリケーションのほとんどは、ローカル ユーザーまたは別の広告ユーザーとして実行されます。
問題と私の質問
SetWindowLong
&SetLayeredWindowAttributes
は、他のユーザー アカウントとして実行されるターゲット アプリケーションでは機能しません。ただし、同じユーザー アカウント (ログに記録されたユーザー アカウント) で実行されるターゲット アプリケーションでは機能します。
別のユーザー アカウントとして実行されている他のアプリのウィンドウの不透明度を変更するにはどうすればよいですか?
イラストアプリ
これは win フォーム アプリです (OpaciToggler.exe と呼びましょう)。2 つのボタン (btnRunSomething と btnHideThatThing) とテキスト ボックス (txtPid) があります。それと同じくらい簡単です。
btnRunSomething をクリックすると、別のユーザーとして .exe が実行されます。すべての詳細は app.config にあります。この場合、このアプリケーション (デバッグ/ビンからの OpaciToggler.exe) を別のユーザー (localComputer\user1) として実行します。
txtPid は手動の pid 入力用です。通常、タスク マネージャー (win > run > taskmgr) を開き、テストするアプリケーション (ターゲット) の pid ([プロセス] タブの下) を見つけて、ここに入力します。
btnHideThatThing をクリックすると、ターゲット アプリケーション (txtPid の pid) の不透明度が切り替わります
コード C#
これは、ターゲットアプリを呼び出す方法です。
これは私が不透明なものを呼び出そうとする方法です
非表示メソッド
その他のコード
RedrawWindowFlags enum (これをどこで入手したか覚えていません)
例、テスト、およびテスト結果
- win XP に domainA\ad_user1 としてログイン
- OpaciToggler.exe アプリケーションを実行します (Instance1、domainA\ad_user1 として実行)
- 次に、実行をクリックします。別の OpaciToggler.exe (Instance2) を開き、別のユーザー アカウント (localcomputer\l_user1 として実行) として実行するか、.exe を右クリックして [次のユーザーとして実行] をクリックします。
インスタンス 1
- ピッド: 1234
- 次のように実行: domainA\ad_user1
- txtPid: 5678 (インスタンス 2、機能しません)
- txtPid: 1234 (自己、動作)
- txtPid: 同じアカウントで実行される pid (例: notepad.exe、calc.exe など)
インスタンス 2
- ピッド: 5678
- 次のように実行: localcomputer\l_user1
- txtPid: 1234 (インスタンス 1、動作しません)
- txtPid: 5678 (自己、動作)
- txtPid: 同じアカウント (localcomputer\l_user1) として実行される任意の pid (例: notepad.exe、calc.exe などは機能しません!!)
繰り返しますが、私の質問
別のユーザー アカウントとして実行されている他のアプリのウィンドウの不透明度を変更するにはどうすればよいですか?
私の下手な英語に感謝し、申し訳ありません:(。
windows - 他の外部プロセスのウィンドウの移動/ドラッグを検出/フック
ウィンドウの移動/他のプロセスのドラッグを検出する最良の方法は何ですか? Windows7 64 ビットの場合
現在、C++ と C# を使用して DLL からグローバル フックを調査しています。うまくいきたくないので辛いです。キーボードとマウスのフックである程度成功しました。しかし、ウィンドウメッセージについては、何が悪いのかわかりません。
これは私の.dllファイルのコードです
自作のエアロスナップを作ろうと思っていました。これはただの楽しみです。
助けてくれてありがとう。
c++ - 64 ビット バージョンの Windows で SetWindowLong() を呼び出すにはどうすればよいですか?
ヘッダーファイルWinUser.h
には、第2引数の定数をSetWindowLong()
定義している部分があります。
_WIN64
ただし、定義されている場合は未定義の直後です。私の64ビットシステムで定義されています。
ご覧のとおり、GWLP_***
一連の定数もありますが、 のページには記載されていませんSetWindowLong()
。
これらの定数が x64 システムで定義されていないのはなぜですか? x64 システム
で呼び出す別の方法は何ですか?SetWindowLong()
私のシステム:
OS: Windows 7 Ultimate x64 SP1
IDE: Visual Studio 2012 Ultimate Update 3
windows - SetWindowLong と GetWindowLong を使用してウィンドウ スタイルを変更するコードを単純化するにはどうすればよいですか?
Windows API のラッパー関数とクラスを作成しています。私が遭遇し始めている一般的な出来事は、Windows スタイルの変更です。
以下は、パラメータ ALIGNMENT 列挙に基づいて TextBox のテキスト配置を調整するサンプル コードです。多くのテストの後、2 つの代替の配置スタイルを削除する必要があるようです。そうしないと競合します。次に SetWindowPos(..SWP_FRAMECHANGED) も機能しないので、スタイルが更新された後に TextBox を強制的に再描画するために InvalidateRect() と UpdateWindow() に置き換えました。
これを行う簡単な方法があれば、フィードバックをお願いします。何かを見落としているような気がします。ありがとう!:)