問題タブ [user32]
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# - アプリケーションのアクティブな ChildWindow を取得するにはどうすればよいですか?
この問題があります: 特定のアプリケーションの mainWindow へのハンドラーがあり、そのアプリケーションでキープレスをシミュレートしたい...
これを行うために sendMessage/postMessage API 呼び出しを使用しています。.Net SendKeys 関数または win32 API の keybd_event を使用しない理由は、それらがグローバル レベルでキープレスをシミュレートするためです。私の場合、ターゲット アプリケーションはトップ アクティブなアプリケーションではありません (他のアプリケーションがより高い z レベルで実行されている可能性があるため、ターゲット アプリをカバーしています)。
sendMessage と postMessage の問題は、キーを押したい正確な子ウィンドウのハンドラーを渡す必要があることです。たとえば、メモ帳では、mainWindow のハンドラーにキーを送信しても何も起こらず、基本的に書き込み可能な白いキャンバスで構成される子ウィンドウのハンドラーにキーを送信する必要があります。
アクティブな子ウィンドウへのハンドラーを取得することが問題です。最初は、最もアクティブな子ウィンドウを返す GetTopWindow または GetWindow(GW_CHILD) API 呼び出しを使用していました。私がやっていたことは、childWindows がなくなるまで、GetWindow(GW_CHILD) を呼び出し続けることでした。これは、メモ帳やペイントなどの一部のアプリケーションでは問題なく機能します。ただし、場合によっては (たとえば、firefox など)、動作しないことがあります。その理由は、親ウィンドウには Firefox 領域全体があり、その子ウィンドウには開かれた Web ページ (Google など) があるためです。そのため、mainWindow の最もアクティブな子ウィンドウを要求すると、Web ページ領域に対応する唯一の子ウィンドウが返されます。アクティブなウィンドウがそのウィンドウである場合にのみ機能します (ユーザーが特定のページのテキストボックスに何かを書いている場合など)。
次のコードを使用して、GetGUIThreadInfo API呼び出しを使用して、実際にこれを行う方法を見つけました。
アドレスバーがアクティブな場合、「W」文字をアドレスバーに送信します。Google の検索テキスト ボックスがアクティブな場合、"W" の文字が送信されます... パーフェクト! ただし、このメソッドは単純な理由で使用できません。ターゲット アプリケーションがオペレーティング システムのアクティブ ウィンドウでない場合、ThreadInfo 構造体は空になります。たとえば、firefox をターゲットにしている場合、firefox がアクティブな場合 (最上位のアプリケーション、フォーカスされた/アクティブなアプリケーション) は機能しますが、たとえば、メモ帳が firefox の上にある場合は機能しません。アクティブなウィンドウ ハンドラを取得できません。
setForegroundWindow API 呼び出しを使用してターゲット アプリケーションをアクティブにし、アクティブな子ウィンドウのハンドラーをキャプチャすることでこれを解決できることはわかっていますが、ターゲット アプリをフォアグラウンドに移動する必要はありませんでした。
また、AttachThreadInput() や GetFocus() API 呼び出しなどの他の手法も試しましたが、これも機能しますが、同じ問題があります。ターゲット アプリケーションがアクティブな Windows アプリケーションでない場合、機能しません。
したがって、基本的には、アプリケーションが最上位のアクティブなアプリケーションでなくても、アプリケーションのアクティブな子ウィンドウにハンドラーを取得する方法を見つける必要があります。
何か案は?ありがとう
c# - アプリケーションのアクティブな ChildWindow を取得するにはどうすればよいですか?
Windows でアクティブなアプリケーションではない特定のアプリケーションに pressKey イベントを送信したいので、sendMessage/postMessage API 呼び出しを使用する必要があります。
ただし、アプリケーションでアクティブになっている正確な子ウィンドウを知り、それに pressKey メッセージを送信する必要があります...
GetTopWindow および GetWindow(GW_CHILD) API 呼び出しを使用して、メイン ウィンドウの一番上の子ウィンドウを取得し、取得した子ウィンドウで再度実行して一番上の grandchildWindow を取得し、子ウィンドウがなくなるまでそれを続けました。 . これは一部のアプリケーションではうまく機能しますが、場合によっては機能しません。親ウィンドウが子ウィンドウではなくアクティブなウィンドウである場合があるため、親の最上位の子ウィンドウを取得しても、メッセージが間違ったウィンドウに送信されてしまいます。
これを行う唯一の方法 (実際のアクティブなウィンドウのハンドラーを取得する) は、GuiThreadInfo API 呼び出しを使用することでしたが、ターゲット アプリケーションが Windows でアクティブなアプリケーションである場合にのみ機能します。冒頭で述べたように、ハンドラが null になるわけではありません。
setForegroundWindow api 呼び出しを使用してアプリケーションを最上位に移動できますが、これはしたくありません。また、AttachThreadInput および GetFocus api 呼び出しも試しましたが、ターゲット アプリケーションが Windows のアクティブなアプリケーションである場合にのみ機能します。
何か案は?ありがとう
windows - 最小化されたウィンドウのRESTORED境界を取得するにはどうすればよいですか?
画面に表示されているすべてのウィンドウの外接する長方形を簡単に取得できます。また、ウィンドウが象徴的であるかどうかを見分けるのも簡単です。
ただし、最小化されたウィンドウの場合、TopとLeftはUser32.GetWindowInfo.rcWindowから-32000として報告されます。APIをすべて調べましたが、ウィンドウがクリックまたは切り替えられた場合にウィンドウが復元される境界を返す呼び出しが見つかりません。
ポインタをありがとう。
winapi - Win32 で新しいウィンドウが作成されたときに通知を受け取るにはどうすればよいですか?
Win32 を使用して、新しいウィンドウが作成されたときに通知を登録する方法はありますか。現在開いているウィンドウのリストを保持しようとしていますが、現在は を使用して現在のウィンドウのリストをポーリングしていますEnumWindows()
。
似たようなことをした人はいますか?
ありがとう
これが正しいかどうかはわかりませんが、SetWindowsHookEx メソッドを起動できません。
何か思い当たりますか?
ここに私のスニップがあります
.net - 単一アプリケーションのシステム カラーの変更 (Windows、.NET)
一般に、このようなシステム設定を台無しにすることは避けなければならないことはわかっていますが、私のアプリケーションではすでに非標準の色が使用されており、私はそれに影響を与えていません。いくつかの場所に標準の .NET コントロールを追加できるようにしたいのですが、それらの色が一致しません。この 1 つのアプリケーションのシステム カラーを置き換えるハックが必要です。注意すべきもう 1 つの重要な点は、これが .NET アプリケーションであることです。
これまでの私の(不完全な)アイデアは次のとおりです。
- GetSysColor を置き換えてプロキシ User32.dll ライブラリを作成するには、非常に面倒です (731 個の関数をリダイレクトする必要があり、1 個を置き換える必要があります)。アプリケーションでその特定のコピーを強制的に使用する方法もわかりません。
- GetSysColors への呼び出しを何らかの方法でインターセプトするには (残念ながら、CLR のどこかにあると思います)。
- 何らかの方法で.NETクラスのSystemColorsを変更するには(メモリ内?可能ですか?)。
これを達成するための最良の(そして完全な)方法は何ですか?
.net - タイトルバーを非表示にし、ac# 形式でパネル内に移動した exe (アンマネージ コード) の位置をロックするにはどうすればよいですか?
.net Windows フォームのパネル内に .exe を「埋め込む」必要があります。user32.dll SetParent を使用して、起動したアプリの親をフォーム パネル ハンドルに設定しています。
これが完了したら、私はしたいと思います
- .exe のタイトル バーを非表示にします
- exeをパネル(最大化)にロックして、移動したり閉じたりできないようにします。
提案?
c# - GetIconInfo 関数が正しく動作しない
GetIconInfo
の関数を使用して現在のカーソルのアイコン情報を取得するアプリケーションを作成しuser32.dll
ました。しばらくの間は正常に動作しますが、しばらくすると間違った情報ICONINFO.hbmMask
(負の値) を提供し始め、次の行でから Bitmap オブジェクトを取得Bitmap.HBitmap(bitmask)
すると、例外がスローされます。
そこから、GetIconInfo
常に負の値を返すため、この例外が継続的に発生します(このコードはすべてループで動作しています)。
誰でもこの問題が何であるか教えてもらえますか? 次の反復例外を回避する方法は?
ここにコードがあります
.net - User32 (vb .net) で別のアプリケーションのコントロールを有効にします
hwnd コントロールが無効になっている (グレー表示されている) 場合に有効にできる関数が user32 にあるかどうか疑問に思っていました。ハンドルがわかっている場合、これを実行できますか? また、メニューアイテムであれば、それもできますか?
ありがとう
c# - ウィンドウの WS_CAPTION スタイルを (user32.dll を使用して) オフにするにはどうすればよいですか?
C# Windows フォームのパネルにサードパーティのアプリを埋め込んでいます ( SetParent
user32.dll を使用)。次に、タイトル バー ウィンドウ スタイルをオフにしてWS_CAPTION
、ホスティング アプリケーションの一部のように見せる必要があります。
これを実現するためにウィンドウのスタイルを変更するにはどうすればよいですか?
例として、_hWnd
を埋め込むアプリケーションのハンドルとします。
c# - windows.formsパネル内でアプリケーションを実行しているサードパーティを「ドッキング」するためのより良い方法は?
私は現在これを次のように行っています:
このコードで私が抱えている問題は、MainWindowHandleを変更すると(つまり、ボタンにテキストがない)、アプリケーションUIの一部が正しく機能しなくなることです。
ドッキングされたアプリケーションで問題を引き起こさずにこれを行う方法はありますか?(.netまたはuser32のいずれかを介して)?