2009-08-03 2 views
16

上のボタンを押してください。 MAKEWORDに別のハンドルを渡し、WPARMとLPARAMを変更しようとしましたが、何もしませんでした。は、プログラムで、私は私の他のアプリケーション上のボタンを押して、次のコードを使用しようとしている別のアプリケーション(C、Windowsの場合)

他のアプリケーションのウィンドウでボタンをクリックする方法についてのアイデアはありますか?

コードが評価されます。おかげさまで

編集: 権限が機能していないように見える理由。 PostMessage()を送信しましたが、結果はGetLastError()= 5(またはAccess Denied)のエラーでした。 アイデア

EDIT2私は失礼であることを意味するものではありませんが、私はすでに検索してくださいしてくださいしてくださいすべてのAPIの取得とボタンの領域を設定して、下ボタンを送信して、ボタンのアップ、コントロールIDの取得など、クラスIDと何千ものIDを取得します。 ここで私が最初に質問した理由は、すでにインターネットで検索してしまったためです。 答えがの場合は、POSTコードをご提出ください。APIを提案しないでください。そのAPIが問題をどのように解決するかを教えてください。それは厳しくない。 ありがとうございます。

編集3:賞金終了時に質問の回答が自動的に選択されました。質問はまだ答えなしで残っています。

+1

これはどのバージョンのウィンドウですか? – billmcc

+3

関連性はないかもしれませんが、管理者としてプログラムを実行するか、Visual Studioを管理モードで実行してみることをお勧めします。これはPostMessageのドキュメントで見たものです。 Microsoft Windows Vista以降。メッセージがUIPIによってブロックされると、GetLastErrorで取得された最後のエラーは5(アクセス拒否)に設定されます。 – FatDaemon

+0

これはVistaまたは7ですか?それはXPで動作しますか? (MicrosoftからVirtual PCで実行するイメージをダウンロードしてテストしてください)sendkeysを使ってみましたか? – svinto

答えて

18
  1. "SaveButton"クラス名が有効ですか?あなたはボタン を手に入れますか?
  2. ButtonHandleウィンドウにメッセージを(ボタンに直接)送信してみます。

アップデート:私は、これは動作するはずと信じて

SendMessage(ButtonHandle, BM_CLICK, 0, 0); 
+0

1)はい。確信してます。私はその情報を得るためにSpy ++を使いました。 2)ボタンのハンドルにメッセージを送信しようとしましたが、何も起こりませんでした。 – wonderer

+0

呼び出したコードにハンドルがありますか? – Tim

+0

確かに私はします。 私はウィンドウにボタンをつけて、さらにボタンクラス – wonderer

0

を(TR3が言ったように)あなたはある、マウスクリックを送信するためのSendKeysを使用することができますSendMessageを使用する場合とは異なります。それはまた直接的ではなく、より多くのハック・アイソですが、自動化(VBSで)に役立ちます。

また、基本的なクラスメンバーを呼び出さないことによって、メッセージ処理がどこかで壊れている可能性があります。例:あなたがボタンを含むウィンドウを上げることができれば

void CMyClass::OnMessageY(CWnd *cwnd) 
{ 
    CBaseClass::OnMessageY(cwnd); 
    //... my code 
} 
+0

ありがとう。これはCです。私はクラスがありません – wonderer

1

あなたはボタンの境界内の位置に、生のマウスイベントを送信することができます。

マウスイベントSendInputmouse_eventをシミュレートする2つの機能があります。 mouse_event機能を使用することをお勧めします。ウィンドウを開くには、ShowWindowを使用します。私はどのようにボタンのハンドルを取得するか分からないが、あなたはその012Wを持っている場合は、GetWindowRect機能を使用して絶対的な位置を見つけるのは簡単です。これらを使用してみてください。何か問題が発生した場合は、私が手伝ってうれしいです。

または、アプリケーション内でカスタムWMを定義するウィンドウ保存要求を処理します。 WM_CUSTOMまたはWM_USER(これは覚えていません)は、ユーザー定義のウィンドウメッセージの開始を示します。

+0

1)例? 2)アプリケーション上にカスタムメッセージハンドラを定義することはできません。 – wonderer

+0

サンプルが長すぎるため、回答を更新しましたので、確認してください。 –

+0

もう一度。アプリケーションやアプリケーションの「ウィンドウ」にカスタムメッセージハンドラを設定することはできません。具体的にコードサンプルをリクエストしたので、サンプルを提供できればそれを感謝します。私が尋ねた理由は、いつもの "try X and Y"を含めて、私が自分で見つけることができるすべての答えを通して既に行ったからです。さて、XとYが動作すると思うなら、コードで私に見せてください。そうでなければ、私は感情のためにあなたに非常に感謝しますが、私が探しているものではありません。 – wonderer

0

よろしいButtonHandleは私がのSendKeysを使用して、物事のこれらの種類をしなければならないときは、ペアWM_LBUTTONDOWNとWM_LBUTTONUPメッセージの代わりに、BN_CLICKED

HWND ButtonHandle; 
if((wnd = FindWindow(0, "Do you want to save?"))) 
{ 
    SendMessage(ButtonHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0); 
    SendMessage(ButtonHandle, WM_LBUTTONUP, MK_LBUTTON, 0); 
} 
+0

すでにこれを試してみました。それは動作しません。私はボタンが押されたくないと思う。 私は「アクセスが拒否されました」というエラーは、SendMessageを使用するとpostmessage()またはC000022な​​どを使用していることです。私はそのエラーを見て、それは基本的に同様に拒否されたアクセスです。 – wonderer

+0

ボタンをプログラマチックに押すことはできますか?) - 他のプログラムがボタンをクリックするのを防ぐためにプログラムフックマウスイベントになる可能性があります。 – Arash

+0

できます。問題はない。 何らかの理由でアプリケーションがメッセージを無視していると思われ始めました – wonderer

1

を使用することができ、有効なハンドルがある場合。これはVB-ishであり、C#は使いやすいインターフェイスを提供しますが、C/C++の場合はそれを行う必要があります< this way>。それはあなたのコードでハードコーディングするのではなく、スクリプトを書いて実行することができてうれしいです。

2

また、あなたが

SendMessage(ButtonHandle, WM_LBUTTONDOWN, 0, 0); 
SendMessage(ButtonHandle, WM_LBUTTONUP, 0, 0); 

それとも

SendMessage(ButtonHandle, BM_CLICK, 0, 0); 

HWND buttonHandle = 0; 

BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM) 
{ 
char label[100]; 
int size = GetWindowTextA(handle,label,sizeof(label)); 
if(strcmp(label,"&Save") == 0) 
{ 
    buttonHandle = handle; 
    return false; 
} 
return true; 
} 
void main() 
{ 
HWND windowHandle = FindWindowA(NULL,"Do you want to Save?"); 
if(windowHandle != 0) 
{ 
    BOOL ret = EnumChildWindows(windowHandle,GetButtonHandle,0); 

    if(buttonHandle != 0) 
    { 
    LRESULT res = SendMessage(buttonHandle,BM_CLICK,0,0); 
    //SendMessage(buttonHandle,WM_LBUTTONDOWN,0,0); 
    //SendMessage(buttonHandle,WM_LBUTTONUP,0,0); 
    } 

} 



} 

注使用することができ、以下のソリューションを参照してください: はスペースがある場合(の終わりにチェックウィンドウのテキスト、ボタンテキストから必ず取得し

0

非Cのアプローチ:Javaとjava.awt.Robotクラスを使用して、実際のクリックを実行してマウスを動かします(Windowsに何かがあると思います)このためにも世界)。 問題:D

3
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0); 
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0); 
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0); 
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0); 

あなたは二回ボタンのクリックを送信する必要があります:あなたは、あなたのボタンがどこにあるか知っている必要があります。理由はわかりません(最初のクリックはボタンのウィンドウをアクティブにするに過ぎないかもしれませんが)、私はこのコードを長い間使用しています。

+0

hmmm ...これを試してみましょう。 – wonderer

2

SendMessageまたはPostMessageのアクセス拒否エラーは、メッセージを送信しているプロセスがターゲットプロセスよりも低い完全性レベルで実行されている場合を除き、意味を持ちません。

ターゲットウィンドウを所有するプロセスがasAdministratorとして実行されているか、サービスでない限り、このようなことは起こりません。そして、Windows 6以上のインタラクティブデスクトップ上にウィンドウを作成するためのサービスは難しい。

この状況にリモートでも適用される場合は、Integrity Levels Hereについての読書を行うことができます。 Internet Explorerは、自身をより効果的にサンドボックス化するために、意図的に自身の整合性レベルを低下させることによって、完全性セキュリティモデルを「オプトイン」する唯一の他のアプリケーションです。

+0

奇妙な。どちらのプロセスも管理者として実行されています。しかし、私がクリックしようとしているプロセスは、サービスのフロントエンド(GUI)です。今、GUIはサービスではありません、それはサービスマネージャを呼び出して、サービスを更新することですが、これはGUIがメッセージを破棄する原因になっているのだろう... – wonderer

1

Microsoftは今 は

参照(これは、年間で数回名前が変更されました)、UIオートメーションのための をActive Accessibility (MSAA)を推進しています申し訳ありませんが、私はあなたのための簡単なコードはありません。「SendMessage()」がうまく機能していないと思われるので、「UIオートメーション」以外の別のオプションについてはわかりません。

私はSpy ++(MsDevと一緒にインストールされています)正しいボタンなどに送信されていること、そしてそのボタンは標準のウィンドウボタンであることを示します。私の最初のインスタントは、 "SendMessage()"または "PostMessage()"を使用しますが、 "SendMessage()"に関する回答の数と実際にはあなたのために働いていないということです。私は誰かが行っていると思う...

+0

まあ、ありがとう、しかし今私は以前よりも混乱しています。 – wonderer

関連する問題