問題タブ [wndproc]
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# - WinForms:WndProcメソッド(フォームクラス)からメッセージボックスを開きます
WndProcがメインUIスレッドではなく別のスレッドで呼び出されることを想像しました。
私は正しかったので、フォームでInvokeRequiredとInvokeを使用するだけで、UIスレッドにメッセージボックスを表示するのに十分だと思いました。
私は間違っていた。そして、その理由がわかりません。
この問題を回避するにはどうすればよいですか?Googleを調べましたが、解決策が見つかりませんでした。
私がやろうとしているのは、クリップボードが変更されたときにカスタムイベント(ClipboardUpdate)を発生させることです。
メッセージボックスは単なるテストでしたが、機能しませんでした。文字列(フォームのプライベートフィールド)のようなものを変更するだけで機能しますが、安全でない方法でのクロススレッド操作であるため、この動作は適切ではありません。
アップデート1:
友人のコンピューターで作成したのでここにはコードがありませんが、短いので自分が書いたものを正確に説明できます。Visual Studioを使用して、何も使用せずに基本的なWinFormを作成しました。AddClipboardFormatListener(相互運用機能ですが、関数としては非常に簡単です。intを返し、IntPtrを受け入れる)関数(Windows 7 OSの場合)を使用して、winproc内のWM_CLIPBOARDUPDATEメッセージを検出しました(単純なif、* if(e.Msg == ClipboardExtension .WM_CLIPBOARDUPDATE)DoClipboardUpdate(); *)。
DoClipboardUpdateはこれを行います:
とても簡単ですよね?OnClipboardUpdateはこれを行うだけです:
ClipboardUpdateは、次のように宣言されたイベントです。
結局、ClipboardUpdateイベントにサブスクライブされた唯一のメソッドには、次のものが含まれています。
コードを実行するとどうなりますか?イベントがトリガーされ(例外を試してみましたが、機能します)、メッセージボックスはポップアップしませんが、ポップアップが開いたように動作するため、フォームを操作できなくなります(これは「通常の」動作です。別のスレッドでポップアップを開くので、そう言ったのです)。
これを解決する方法について何か提案はありますか?
oop - この OO win32API の例は複数のウィンドウで動作しますか?
私は主に、この例が友人として wndproc をどのように使用するかに焦点を当てています...私はそれがどのように機能するかについて少し混乱しており、これが複数のウィンドウで機能するかどうか、またどのように機能するかを理解しようとしています
c# - NativeWindowでのWM_GETOBJECTの処理からIOleCommandTargetを返します
パネルコントロールハンドルからIOleCommandTarget参照を取得しようとしているので、IOleCommandTarget.Exec()を呼び出すことができます。
私のNativeMethods.csでは:
IOleCommandTarget参照を返すことができるようにするために、NativeWindowとIOleCommandTargetを実装するCommandTargetWindowクラスを作成し、AccessibleObjectFromWindow()が送信するWM_GETOBJECTメッセージをインターセプトするようにWndProcをオーバーライドしています。
問題は、上記のコメントのように、メッセージを介してIOleCommandTargetを返すにはどうすればよいですか?
自動化の目的で、(IOleCommandTargetの代わりに)インターフェイスIRawElementProviderSimpleを実装し、定義された静的メソッドAutomationInteropProvider.ReturnRawElementProvider()を使用して、他の場所でも同様のことを行います。
何か案は?
c# - ウィンドウキャプションのカーソルを変更します
WinFormを使用しているので、Windowsキャプション部分にあるときにカーソルを変更する必要があります。いくつかのコードが機能していますが、2つの問題があります。
また、端にあるときにカーソルを変更します(通常のサイズ変更カーソルが表示されます)。このようなものが必要だとわかりましたWM_NCHITTEST
がHTTOP
、どうすればそれを組み合わせることができますか?- マウスを動かすときにちらつきがあります。
また、コードをの下に配置してみましたbase.WndProc(ref m);
。
これは私がすでに持っているコードです:
編集:
Spy++でメッセージを正しくログに記録していませんでした。ウィンドウの端の解決策を見つけました(更新されたコードを参照)。
Thnx、J
c# - オブジェクト インスタンスを WndProc に送信する方法
いくつかの状態と値を記述するカスタム クラスを使用しています。
アプリケーション アーキテクチャのため、フォーム インタラクションにはメッセージとそのインフラストラクチャ (SendMessage/PostMessage、WndProc) が使用されます。問題は、SendMessage/PostMessage を使用して MyClass のインスタンスを WndProc に送信する方法です。私のコードでは、PostMessage は次のように定義されています。
そのため、何らかの方法でカスタム メッセージ番号の下に送信する必要があり、MyClass インスタンスが必要なので、WndProc でロジックのニーズに使用できます。それが可能だ?
c# - メッセージを使用した 2 つのプロセス間の通信
ここから始めましたが、まだ質問が閉じていません-アーキテクチャ全体を修正する必要があると思います-ご意見をお聞かせください...
アプリケーションがどのように動作するかは次のとおりです。スケジューラは同じアプリケーションを複数回実行しますが、引数は異なります。パラメータや引数を指定せずにアプリケーションを起動すると、設定データを編集できるフォームが表示されます。複数の実行にもかかわらず、アプリケーションのインスタンスは 1 つだけである必要があります。
私のアプローチ - 単一インスタンスの場合、ApplicationContext と NativeWindow で Mutex を使用しました。これはここで説明されています 私が克服できないこと - アプリケーションの新しいインスタンスが開始されたとき - このインスタンスがパラメーターで開始された場合 - データを送信する方法 - パラメーター - 実行中のアプリケーションのインスタンスに? メッセージ (SendMessage/PostMessage) を使用してデータを送信しようとしましたが、成功しませんでした。
多分誰かが別のアプローチを与えることができますか?
winapi - Win32親ウィンドウでの子ウィンドウメッセージのキャプチャ
私の Win32 アプリケーションでは、サード パーティの SDK によって子ウィンドウが作成されます。ウィンドウの作成プロセスは透過的であり、WndProc メソッドを子ウィンドウに関連付けることができません。親ウィンドウで子ウィンドウのメッセージをキャプチャできるようにしたい。これどうやってするの?どんな助けでも大歓迎です。
c# - WPF:「プログラマー」の介入なしにアプリケーションがシャットダウンしたときにセカンダリウィンドウを閉じる
タイトルでこれを説明するのは非常に難しいです。誰かがそれを変更したいのであれば、それは大丈夫です。
WPFで、プログラマーに対して透過的な「非表示」ウィンドウを作成する状況があります。つまり、このウィンドウは静的コンストラクターで作成され、非表示にして画面の外に移動され、幅と高さは0です。これは、このウィンドウを使用していくつかの相互運用操作を実行し、すべてのハンドラーの一種を許可しているためです。誰かが要求する可能性のあるWndProcsオーバーライド(WndProcをオーバーライドする必要があるメソッドを処理するデリゲートのリストがあります)。
私が言ったことを理解してくれることを願って(簡単ではありません)、私の問題は、WPFプロジェクトを作成して開始するときに、メインウィンドウ(プログラマーに対して透過的に作成されたものではない)を閉じると、アプリケーションをシャットダウンしたい。ただし、私が作成したコードでは、Application.Current.Shutdown()を使用する場合を除いて、これは発生しません。
そのメソッドを呼び出さずにこれを修正する方法はありますか?他のプログラマーが気付かないような透過的な方法が必要です(これはlibであり、この方法で動作するプログラムの動作を変更しないでください)。
提案をありがとう、ここにいくつかのコードスニペットを見ることができます:
libによって作成されたウィンドウ
wpfで作成された通常のウィンドウ(プロジェクトから作成されたベースウィンドウ)
アップデート1:
あなたの答えに答えるために、いいえ、私は私のライブラリを使用するプログラマーによる介入を避けたいので、理想的な解決策は、私のライブラリでいくつかのApplication.Exitイベントをサブスクライブしてウィンドウを閉じることです、明らかに私はApplicationを使用できません。ウィンドウが閉じないためにアプリケーションが閉じないため、終了します
たぶん、アプリケーションに属するすべてのウィンドウを計算する方法はありますか?私もそれで何かできる
c# - WndProc: フォームが最小化されたときにウィンドウ メッセージを取得する方法
特定のサービスと通信するには、WindProc
. ウィンドウメッセージを受け取ります。
ただし、フォームを最小化すると、メッセージが表示されなくなります。そのようにしなければならないことはわかっていますが、これに対する回避策はありますか? 常に開いたままの非表示のフォームは使いたくない...
window - DispatchMessage はどの WndProc を使用するかをどのように決定しますか?
私はオープン ソース プロジェクトのコードをいくつか調べていますが、Win32 アプリを扱うのはこれが初めてです (主にコンソール関連の操作を行いました)。コード内のいくつかの関数は LRESULT CALLBACK を返すため、Windows プロシージャであることがわかります。
DispatchMessage が適切な WndProc を呼び出すか、または DispatchMessage が適切な WndProc をすべて独自に決定できるようにコーディングされていることを確認するために、プログラマーがしなければならないことはありますか?
編集:
DispatchMessage(const MSG*) がアプリケーション内の異なる WndProc を選択する方法は、渡された MSG オブジェクトのウィンドウ ハンドル メンバ (HWND) に基づいていると推測しています。たとえば、メッセージがアプリケーションの編集ウィンドウ用であった場合 (メイン ウィンドウ用ではありません)、DispatchMessage は、編集ウィンドウがオブジェクトである特定のクラスの WndProc メンバー関数を選択します。メッセージがメイン ウィンドウの場合、メイン ウィンドウがオブジェクトであるクラスの WndProc メンバー関数が選択されます (私にとって、このクラスは Notepad_plus_Window クラスになります)。ただし、これは単なる考えです。私はそれを裏付けるものがあまり見つからなかったので、誰かがこれを確認できたらうれしいです.