プロが教えるわが家の防犯対策術!

Windows上で、マウスで右クリック→ファイル名をコピー→貼り付け

という動作をプログラミングによって実現したいのですが、どのようにしたら良いのでしょう?
やはり、APIを使うと思うのでC#が適しているかと自分では思っているのですが、CでもC++でもかまいません。
どなたかご教授願えますか?よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

★『ファイル名をコピー』の処理を自分のプログラムに組み込んでみるのはどう?


・もう少しだけ詳しい動作の仕組みを補足要求します。
・また『mouse_event』という API 関数は古いので新しい関数『SendInput』を使いましょう。
・ただし、この『SendInput』関数はマウス以外にキーボードのエミュレートも行えるため
 少しだけ複雑な指定になります。慣れれば何てことないが…。→また紹介します。
・まぁ、とにかくもう少し何を行いたいのかを補足して下さい。
・まさか、本当に『右クリック』→『ファイル名をコピー』→『貼り付け』の3ステップを
 行いたいのですか?

参考URL:http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?p …
    • good
    • 0

予想されている通り


mouse_event()
というAPIを使用します。
詳しい使い方は調べていただくとして、実際に作るのはとても難しいと思いますよ。
たとえば、右クリックからコピーを選択させるためには
マウスをどれだけ動かして・・・とかいう処理が必要になります。
シェル拡張とかされていると、とてもイヤンな感じです。

言語に関してはWindows APIを使うならCないしC++のほうが
比較的容易だと思います。あくまでも僕の主観ですが。
    • good
    • 0
この回答へのお礼

回答ありがとうござます。
そのAPIだと座標指定など、毎回同じ様に操作できないですよね・・・
windows APIならうまくいくんでしょうか?

お礼日時:2007/01/17 17:12

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語でのマウスを移動とマウスクリック

C言語で指定の座標にマウスを移動させクリックさせるにはどうすれば良いでしょうか?
例えばX=200,Y=200にマウスを移動させクリックさせるにはどのようなコードを書けば良いでしょうか?
以上、宜しくお願い致します。

Aベストアンサー

標準Cライブラリにはマウスを扱う関数は無いでしょうから無理かと思われます。

WindowsやX-Window Systemなり使っているのであれば、そういうAPIがあるかも知れませんが。

Q他のウィンドウのボタンを自動的に押したい

VisualC++で作ったアプリケーションから、例えばWindowsに標準搭載の「電卓アプリケーション」のウィンドウをアクティブにして、さらにその中の「1」ボタンを認識して押す、テキストボックスを認識してそこに文字列を入れるといったソフトを作りたいです。

簡単にいうと、他のアプリケーションを自動的に操作するソフトを作りたいのです。

これを実現するために、Web検索してみましたが、関連する技術の名前やMFCでのAPI名がわからないです。これはどういった名前の技術で、VisualC++でどういった名前の関数を使うのでしょうか?

当方の環境はWindowsXP&VisualC++6.0です。

以上、よろしくお願いします。

Aベストアンサー

★列挙方法のアドバイス
・補足になる仕様の
>(1)ウィンドウのタイトルバーの名前(例:「電卓」)、
>またはウィンドウのIDでウィンドウを探す
 ↑
 これなら FindWindow() 関数でウインドウ・ハンドルを探せます。
 例: HWND hWnd = FindWindow( "SciCalc", "電卓" );
>(2)最初にヒットしたウィンドウをアクティブにする
 ↑
 最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。
 例: SetForegroundWindow( hWnd );
>(3)アクティブにしたウィンドウの中にあるボタンを探す
 ↑
 (1)で取得しているウインドウに対して子ウインドウ(ボタンなど)を列挙します。
 列挙には EnumChildWindows() 関数と EnumChildProc() のコールバック関数を使います。
>(4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す
 ↑
 列挙のコールバック関数(EnumChildProc)でボタンのキャプションを調べて
 『1』となっている文字列が電卓の『1』ボタンです。
 このときにボタンを押す処理をプログラムから行います。
 例: SendMessage( hChild, BM_CLICK, 0, 0 );
 URL: http://wisdom.sakura.ne.jp/system/winapi/win32/win53.html
・上記のような感じで操作できます。
 一番重要なのは操作するウインドウのハンドルを正しく見つけ出すことです。
 このウインドウ・ハンドルを見つけるには次の方法があります。
 (1)FindWindow() 関数を使う
 (2)EnumWindows() 関数を使う
 (3)Process32First()、Process32Next() 関数を使う
 (4)EnumProcesses() 関数を使う
 などがあります。
 今回は簡単な(1)を紹介しました。
 もしもウインドウのクラス名やキャプション名以外で詳しく捜査対象の
 ウインドウを検索するには(2)の EnumWindows() 関数や起動パス名を
 調べて特定できる (3)、(4)の関数群を利用します。
>テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。
 ↑
 ボタンなどのテキストを認識、保存には GetWindowText()、WM_GETTEXT メッセージを
 使います。メッセージの場合は SendMessage() 関数でキャプション文字列を取得します。
 例: SendMessage( hChild, WM_GETTEXT, sizeof(szBuff), szBuff );
・下に簡単なボタンの列挙を載せます。これを活用して下さい。

サンプル:
#include <stdio.h>
#include <windows.h>

// コールバック関数
BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam )
{
 TCHAR szBuff[ 1024 ];
 
 // キャプションの取得
 GetWindowText( hWnd, szBuff, sizeof(szBuff) );
 printf( "├[%s]\n", szBuff );
 return TRUE;
}

// メイン関数
int main( void )
{
 HWND hCalc;
 
 if ( (hCalc = FindWindow("SciCalc","電卓")) != NULL ){
  printf( "◆電卓のコントロール列挙\n" );
  EnumChildWindows( hCalc, EnumChildProc, NULL );
 }
 return 0;
}
以上。

★列挙方法のアドバイス
・補足になる仕様の
>(1)ウィンドウのタイトルバーの名前(例:「電卓」)、
>またはウィンドウのIDでウィンドウを探す
 ↑
 これなら FindWindow() 関数でウインドウ・ハンドルを探せます。
 例: HWND hWnd = FindWindow( "SciCalc", "電卓" );
>(2)最初にヒットしたウィンドウをアクティブにする
 ↑
 最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。
 例: SetForegroundWindow( hWnd );
>(3)アクティブにしたウィンドウの中にあるボタンを...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

Qマウスポインタを移動させるには

C++でプログラムしています。
MessageBoxのOKのボタンの上にマウスカーソルを移動させるAPI関数を教えてください。

Aベストアンサー

> MessageBoxのOKボタンの座標を調べるAPI関数を教えてください。

残念ながら、それは簡単にはできません。
というのは、MessageBoxを実行すると、OKボタンなどをクリックしない限り、プログラム側に制御が戻ってこないからです。
スレッドを使って、プログラムの動作を2系統に分けて、MessagbeBoxで一方の動作が停止しても、他方が動作中の状態にする必要があります。その上で、メッセージのウィンドウを探してその中のOKボタンの位置を調べるといった方法になります。

簡単にしたいのであれば、MessageBoxが表示するウィンドウに似たウィンドウをプログラムから表示させるというものがあります。この場合、ウィンドウを表示しても制御はプログラム側にあるし、自分で表示させたウィンドウだから、OKボタンの位置も簡単にわかります。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qc言語でのカーソル移動(?)について

C言語でCUIに表示された20*20の●をカーソルで移動するプログラムを作ろうと思い、
カーソルでの移動の部分でカーソルのアスキーコードを探しても無く、どうプログラムしたら良いのかがわからなくて、困っています。
やり方を教えていただけませんでしょうか?

Aベストアンサー

環境はなんです?
たいていはエスケープシーケンスとかで移動させることになりますけど。

http://archive.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html
http://www.mm2d.net/c/c-06.shtml

QC#でSendInputを使ったサンプルを動かそうとしているのですが、よくわかりません

Visual Studio 2015を使用しています。
OSはWindows10です。
SendInputを使用してプログラムを作ろうとしているのですが、うまくいかず、
サイトhttp://pgcenter.web.fc2.com/contents/csharp_sendinput.html
のサンプルを基に(そのままに近いですが)動作を確認しながら作っていこうとしています。
Any CPUではなく86でコンパイルし、エディタソフト起動(このソフトに「A」を出力)、アプリを起動して、ボタンをクリックしてもエディタには何も出力されません。
どこか間違っていますか?
(Form1.csは字数の関係で補足に記述します)

Aベストアンサー

Windows10 64Bit
VS2015 community
で、掲示されたページのものをコピペ。
プロジェクトをWindowsフォームアプリケーションで作成したので
正確にはちょっと違いますが。

using System.Runtime.InteropServices;
をコピぺ。
// マウスイベント(mouse_eventの引数と同様のデータ)
から
private const int VK_SHIFT = 0x10; // SHIFTキー
までをコンストラクタの上にコピペ。
フォームにボタンコントロールを配置してClickイベントのハンドラを追加。
ハンドラ内にButton1_Click()の中身をコピペ。

AnyCPUのままビルドして実行。

秀丸を起動。
そのまま今回のフォームをクリックしてアクティブ状態を切り替え。
で、ボタン押下で秀丸に"A"が追加されました。

Qマウスの移動範囲を限定するには?(Clipcursor関数)

現在visualC++6.0で遠隔地の映像を送受信するためのカノープスというサンプルプログラムをもとに、プログラムを作成しています。
そこでマウスの移動範囲を限定するにはどうすればいいでしょうか?
MFC App wizardを使っており、ClipCursou関数を用いればできるようなことをネットで調べ見たのですがどのように使えばいいのかわかりません。
またClipcursor関数のようなAPI関数は、MFCで使うことができるのでしょうか?
実際に実現したいことは、メニュー画面のボタンをクリックしたらマウスの移動範囲を画面の上半分に限定、またはプログラムを実行した地点でマウス移動範囲を画面の上半分に限定できたらいいと思っています。
プログラムに関しては素人なので説明の至らない点もあると思いますが、どうかよろしくお願いします。

Aベストアンサー

★調べたとおりの ClipCursor() で行えます。
>またClipcursor関数のようなAPI関数は、MFCで使うことができるのでしょうか?
 ↑
 RECT rc;
 
 rc.left = 左上隅のX座標
 rc.top = 左上隅のY座標
 rc.right = 右下隅のX座標
 rc.bottom = 右下隅のY座標
 ::ClipCursor( &rc );
 ↑
 これを付ける。→『スコープ解決演算子』
>実際に実現したいことは、メニュー画面のボタンをクリックしたらマウスの移動範囲を画面の上半分に限定、
>またはプログラムを実行した地点でマウス移動範囲を画面の上半分に限定できたらいいと思っています。
 ↑
 移動可能な長方形領域(スクリーン座標)を RECT 構造体にセット。
 その後に ClipCursor() API 関数などを実行すれば良いだけ。
・注意点は一度実行したら元の移動範囲に戻すための手段をきちんと作ります。
 マウスが移動できる範囲内で元に戻すボタンか何かを設置します。
 あとプログラムが終了する前に必ず ClipCursor( NULL ); として元に戻します。
・以上。

参考文献:
・http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_clipcursor.asp
・http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_clienttoscreen.asp
・http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_screentoclient.asp

★調べたとおりの ClipCursor() で行えます。
>またClipcursor関数のようなAPI関数は、MFCで使うことができるのでしょうか?
 ↑
 RECT rc;
 
 rc.left = 左上隅のX座標
 rc.top = 左上隅のY座標
 rc.right = 右下隅のX座標
 rc.bottom = 右下隅のY座標
 ::ClipCursor( &rc );
 ↑
 これを付ける。→『スコープ解決演算子』
>実際に実現したいことは、メニュー画面のボタンをクリックしたらマウスの移動範囲を画面の上半分に限定、
>またはプログラムを実行した地点でマウス移動範囲...続きを読む

Qwindows.hがincludeされない

http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/を見ながら何度も試したのですがどうしてもwindows.hがインクルードされません。上記のページに書いてあること以外に必要な作業があるのでしょうか?

Aベストアンサー

回答見る限り、パスが設定されてないっぽいですね。

具体的には
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
の手順3です。

VC++ 2005のメニューから、
ツール → オプション → プロジェクトおよびソリューション → VC++ ディレクトリ
で、
ディレクトリを表示するプロジェクト→
・実行可能ファイル
・インクルードファイル
・ライブラリファイル
の3つの場所にそれぞれ手順3に書かれたパスを追加します。

インクルードファイルの項に追加したパスが、windows.hのある場所なので、これで大丈夫だと思います。
自分もここでつまずいたので…


人気Q&Aランキング