ページ 1 / 1
デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 12:27
by ぺよん
どうも!いつもお世話になっております。
デスクトップのアイコンの場所を移動させるプログラムを作成しようとしてるのですが、
こちらの
http://7ujm.net/C++/DesktopIconPoint.html サイトのコードを参考にしているのですがどうやって作ればいいかわかりません。
C言語初心者です。VC++2010を使用しています。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 12:33
by softya(ソフト屋)
初めてのような気もするのですが、ぺよんさんは前は別の名前でしたか?
サイトを見ましたがWindows(Win32)APIを使っているようです。
Windows(Win32)APIでのアプリは作成した経験がお有りでしょうか。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 12:39
by ぺよん
かなり前に『でんでん』と言う名前で質問させていただいたことがあります。
Win32は一応使ったことがあるのですが、アプリと呼べる物では無くウィンドウを作成する程度です。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 12:44
by softya(ソフト屋)
で、何処が分からないのでしょうか?
すごくやりたい事はコンパクトに示されているサンプルコードだと思いますが。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 12:52
by ぺよん
一応、見よう見まねで書いてみたのですが。
#include <windows.h>
#include <tchar.h>
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")
#define WINDOW_WIDTH (400)
#define WINDOW_HEIGHT (300)
#define WINDOW_X ((GetSystemMetrics( SM_CXSCREEN ) - WINDOW_WIDTH ) / 2)
#define WINDOW_Y ((GetSystemMetrics( SM_CYSCREEN ) - WINDOW_HEIGHT ) / 2)
#define ID_STATUS (100)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
HWND hWnd;
hWnd = FindWindow("ProgMan",NULL);
hWnd = GetWindow(hWnd,GW_CHILD);
hWnd = GetWindow(hWnd,GW_CHILD);
if(!hWnd) return false;
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd,&dwProcessId);
HANDLE hProcess = OpenProcess(
PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
FALSE,dwProcessId);
if(!hProcess) return false;
POINT* pnt = (POINT*)VirtualAllocEx(hProcess,
NULL,4096,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
POINT iconPos;
ListView_GetItemPosition(hWnd,0,pnt);
ReadProcessMemory(hProcess,pnt,&iconPos,sizeof(POINT),NULL);
VirtualFreeEx(hProcess,pnt,0,MEM_RELEASE);
}
動かないのです。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 12:57
by beatle
アイコンの場所を移動させたいのか,アイコンの場所を取得したいのか,どっちですか?
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 13:00
by ぺよん
アイコン移動です。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 13:03
by beatle
ぺよんさんのソースコードは
ぺよんさんがお示しになったサイトのサンプルのうち,「○デスクトップのアイコンの場所を取得する」をコピペしているように見えます.「○デスクトップのアイコンの場所を移動する」の方を試してみましょう.
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 13:03
by softya(ソフト屋)
codeタグを利用とインデントの整形をお願いします。インデントに関しては「投稿前チェックリスト(beatleさん作成)」も確認して下さい。
http://dixq.net/board/board.html
指摘されていますが、移動ではなく取得のコードを使っていますね。
あとコードの1命令づつの動作を調べられましたか?
サンプルコードは書き方の例であって、1命令づつの動作を把握しないと思うようなものは作れませんよ。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 13:28
by ぺよん
すいません、コードを書き込むのは初めてだったので知りませんでした。
一応、移動の方で書いてみたのですが。
コード:
#include <windows.h>
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
HWND hWnd;
hWnd = FindWindow("ProgMan",NULL);
hWnd = GetWindow(hWnd,GW_CHILD);
hWnd = GetWindow(hWnd,GW_CHILD);
if(!hWnd)
return false;
SendMessage(hWnd, LVM_SETITEMPOSITION, (WPARAM)0, (LPARAM) MAKELPARAM ((int) 10, (int) 10));//set
}
ビルドはされるのですが、デバックしても反応が無いです。
あと、『.cpp(24): warning C4715: 'WinMain' : 値を返さないコントロール パスがあります。』というのが出ます。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 13:59
by softya(ソフト屋)
XPだと大丈夫だと思いますが、WindowsVista/7はデスクトップの設定を変えて自動整列・等間隔整理を止めたりしないとダメだと思います。
あるいはUACがじゃまをするかも知れませんし、しないかも知れません。都合があってこちらでは申し訳ないですが試せません。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 14:15
by fulls
ぺよん さんが書きました:あと、『.cpp(24): warning C4715: 'WinMain' : 値を返さないコントロール パスがあります。』というのが出ます。
これはメイン関数が値を返しませんということです。
コード:
if(!hWnd)
return false;
でhWndが取得できなかった時は失敗という形でメイン関数を終わらせているようですが、正しくhWndを取得した時は明示的にプログラムを終了できていません。
WinMain関数の最後に
とかをいれて置けば警告は出ないと思います。
あと一つ気になったのですが、返り値がintなのにfalseを返すと言うのはやって構わないことなのでしょうか?
他の方の質問で聞いてしまってすいません。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 14:46
by softya(ソフト屋)
pefs3d さんが書きました:あと一つ気になったのですが、返り値がintなのにfalseを返すと言うのはやって構わないことなのでしょうか?
他の方の質問で聞いてしまってすいません。
本当はあまり良くないですが、C99であればstdbool.hにfalseは0と定義されています。
C++ではfalseは0なのでintの戻り値として使用出来てしまいます。
まぁ。どちらにしても使わないほうが良いのは確かです。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 15:02
by fulls
softya(ソフト屋) さんが書きました:
本当はあまり良くないですが、C99であればstdbool.hにfalseは0と定義されています。
C++ではfalseは0なのでintの戻り値として使用出来てしまいます。
まぁ。どちらにしても使わないほうが良いのは確かです。
ありがとうございます。
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 15:32
by ぺよん
softya(ソフト屋) さんがおしゃったとうり、自動整列・等間隔整理を止めてプログラムを管理者として実行したのですが・・・
何故かアイコンが一番左上に行ってしまいます。
あと、アイコンの移動場所はコードのどこを変えればいいのですか?
Re: デスクトップのアイコンの場所を移動
Posted: 2012年1月14日(土) 15:40
by softya(ソフト屋)
上にも書きましたが1命令ごとの動作をちゃんと調べないと意味がありません。
プログラムすると言う事は理解して使うことです。
解析して何処の命令が分からないか聞いて下さい。